设计模式之命令模式

70 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

简介

命令模式的定义:

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

简单的来说就是将命令组装成一个对象传给调用者,调用者自己看情况去处理该命令。在命令模式的使⽤场景中一般需要分为三个模块,即命令、实现和调用者。

案例

我们通过一个常见的开发的例子来说明,即项目经理下发需求让研发人员开发的过程。这个场景中的调用者就是项目经理、命令就是新增需求或者需求变更、实现就是咱们开发人员了。话不多少,上代码。

我们先定义一个抽象的命令类,后续如果项目经理有其他的命令也可以通过这个接口来进行拓展。命令接口有一个say的说话方法

public interface ICommand {
    void say();
}

然后有一个开发者,他的方法有新增需求和修改需求

public class Developer {
    public void addRequirement() {
        System.out.println("add requirement");
    }
    public void modifyRequirement() {
        System.out.println("modify requirement");
    }
}

然后分别定义2个命令的实现,也是一个新增需求,一个修改需求

public class AddReqCommand implements ICommand {
    private Developer developer;
    public AddReqCommand(Developer developer) {
        this.developer = developer;
    }
    @Override
    public void say() {
        developer.addRequirement();
    }
}
public class ModifyReqCommand implements ICommand {
    private Developer developer;
    public ModifyReqCommand(Developer developer) {
        this.developer = developer;
    }
    @Override
    public void say() {
        developer.modifyRequirement();
    }
}

接下来定义一个调用者,即项目经理类,我们将命令传入项目经理里,项目经理一声令下,即可调用发布命令

public class Pm {
    private ICommand iCommand;
    public Pm(ICommand iCommand) {
        this.iCommand = iCommand;
    }
    public void execute() {
        iCommand.say();
    }
}

最后我们通过应用类来模拟项目经理发号施令

public class App {
    public static void main(String[] args) {
        AddReqCommand addReqCommand = new AddReqCommand(new Developer());
        Pm pm = new Pm(addReqCommand);
        pm.execute();
    }
}

总结

我们上面的例子的确实现了命令模式,我们可以新增命令来进行拓展,但是新增一个命令,我们也需要在开发者类中对命令进行执行。所以开始没有完全解耦,那我们是不是可以将执行类即开发者也进行抽象呢?这是个值得考虑的问题。

命令模式的优点很明显,它大大降低了系统的耦合度,将命令抽象出来,降低耦合,而且符合开闭原则,如果我们有新的命令加进来,我们只需要做新增,而不需要做修改。缺点也是很明显,设计模式的使用使代码量大大增加了。