介绍
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
类图说明
假设一个场景,老板跟经理沟通说,我想要制造宝马X6和宝马X7,制造出来后,需要把它卖掉。那么我们可以将老板的需求理解为两个命令,第一个命令制造宝马车,第二个命令出售宝马车。ok,那么应用到命令模式里边,就可以设计为四层,最底层实际干活的,也就是真正制造宝马X6和X7的,所以定义了一个接口和两个实现类。往上一层就是命令封装层,该层核心的一个方法execute()方法,需要具体实现每个命令实际做的事情,而我们场景中分别为SellCom和BuilderCommand两个命令,分别调用宝马X6和X7两个对象干对应的活,再网上一层定义类似经理的角色Invoker,接收老板的命令,最上层老板想好自己命令告知经理执行。
代码示例
文件结构如下:
代码示例如下:
public interface BMW {
void builder();
void sell();
}
public class BMWX6 implements BMW {
@Override
public void builder() {
System.out.println("BMWX6已制造");
}
@Override
public void sell() {
System.out.println("BMWX6已出售");
}
}
public class BMWX7 implements BMW {
@Override
public void builder() {
System.out.println("BMWX7已制造");
}
@Override
public void sell() {
System.out.println("BMWX7已出售");
}
}
public abstract class Command {
protected BMWX6 bmwx6 = new BMWX6();
protected BMWX7 bmwx7 = new BMWX7();
public abstract void execute();
}
public class BuilderCommand extends Command {
@Override
public void execute() {
super.bmwx6.builder();
super.bmwx7.builder();
}
}
public class SellCommand extends Command {
@Override
public void execute() {
super.bmwx6.sell();
super.bmwx7.sell();
}
}
public class Invoker {
private Command command;
public void setCommand(Command command){
this.command = command;
}
public void action(){
this.command.execute();
}
}
public class CommandPattern {
public static void main(String[] args) {
BuilderCommand builderCommand = new BuilderCommand();
SellCommand sellCommand = new SellCommand();
Invoker invoker = new Invoker();
invoker.setCommand(builderCommand);
invoker.action();
invoker.setCommand(sellCommand);
invoker.action();
}
}
运行结果如下:
应用场景
认为是命令的地方都可以使用命令模式,比如:
- GUI 中每一个按钮都是一条命令
- 模拟 CMD
优缺点
优点
- 降低了系统耦合度
- 可拓展性好,新的命令可以很容易添加到系统中去
缺点
- 使用命令模式可能会导致某些系统有过多的具体命令类