携手创作,共同成长!这是我参与「掘金日新计划 · 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();
}
}
总结
我们上面的例子的确实现了命令模式,我们可以新增命令来进行拓展,但是新增一个命令,我们也需要在开发者类中对命令进行执行。所以开始没有完全解耦,那我们是不是可以将执行类即开发者也进行抽象呢?这是个值得考虑的问题。
命令模式的优点很明显,它大大降低了系统的耦合度,将命令抽象出来,降低耦合,而且符合开闭原则,如果我们有新的命令加进来,我们只需要做新增,而不需要做修改。缺点也是很明显,设计模式的使用使代码量大大增加了。