/**
* 命令模式
*/
public class Main {
public static void main(String[] args) {
CatReceiver catReceiver = new CatReceiver();
RunCommand runCommand = new RunCommand(catReceiver);
StopCommand stopCommand = new StopCommand(catReceiver);
Invoker invoker = new Invoker();
invoker.addCommand(runCommand);
invoker.addCommand(stopCommand);
invoker.execute();
}
}
public interface Command {
void execute();
}
class CatReceiver {
public void run() {
System.out.println("cat is running");
}
public void stop() {
System.out.println("stop running");
}
}
public class RunCommand implements Command{
public CatReceiver catReceiver;
public RunCommand(CatReceiver catReceiver){
this.catReceiver = catReceiver;
}
@Override
public void execute() {
catReceiver.run();;
}
}
public class StopCommand implements Command{
public CatReceiver catReceiver;
public StopCommand(CatReceiver catReceiver){
this.catReceiver = catReceiver;
}
@Override
public void execute() {
catReceiver.stop();
}
}
import java.util.ArrayList;
import java.util.List;
public class Invoker {
private List<Command> orderList;
public Invoker() {
orderList = new ArrayList<Command>();
}
public void addCommand(Command command){
orderList.add(command);
}
public void execute(){
orderList.forEach(Command::execute);
}
}
问题:
如果你有一系列需要执行的操作,但是还可能增加一些新的操作,或者删除一些操作,直观的写法是把这些操作都写到一个函数里,这样耦合就高了,新增一个操作还需要改代码。
用法:
这个设计模式最难的是怎么理解命令,什么是命令。
其实消息系统就是典型的命令设计模式,一个消息就是一个命令,每个消息都会实现同样的接口,至于这个消息就是扮演接受者的角色。
命令模式和策略模式的区别
网上也有不少讨论的,总结起来策略模式体现的是多个策略单选一个,命令模式体现的是多个策略执行的问题,而不是选择的问题,且策略模式其实是接口的最基本使用方法,命令模式是一种特殊的策略模式。