命令模式,解耦了请求者和调用者。请求以命令的形式包裹在对象中,传给调用对象,调用对象负责构造和控制命令的执行。也就是请求者发出一个请求,但是不知道具体的执行者,也不知道具体的执行细节,只需要知道这个请求被执行了;执行者者只需要老老实实的干活就行了,不需要知道上游的具情信息。调用者则在接到请求后,只负责构造命令以及控制命令的执行,这样请求者和执行者就彻底的解耦了,任何一方不用依赖其他方,只需要专心做自己的事情。比如:比如“二营长把老子的意大利炮拉过来”,李云龙发出命令:把老子的意大利炮拉过来,二营长执行这个命令,具体怎么拉,团长不管。有三个主要的对象
- 命令:持有接受对象
- 接收者:具体的执行
- 调用者:持有命令对象,特定时间点发布命令
实现
首先声明一个命令,定义具体的方法
public interface Command { void execute(); }
实现接口
public class GetCannonCommand implements Command { private Receiver receiver; public GetCannonCommand(Receiver receiver) { this.receiver = receiver; } @Override public void execute() { System.out.println("cmd execute"); receiver.action(); } }
接收者,具体的执行人:
public class Receiver { public void action(){ System.out.println("get cannon"); } }
调用者,发布命令:
public class Invoker { private Command command;//只有一个命令 public Invoker(Command command) { this.command = command; } public void sendConmmad(){ System.out.println("send cmd"); command.execute(); } }
测试:
public static void main(String[] args){ Receiver receiver = new Receiver(); Invoker invoker = new Invoker(new GetCannonCommand(receiver)); invoker.sendConmmad(); // 输出 // send cmd // cmd execute // get cannon }
优缺点
- 优点
- 降低了耦合度
- 新命令添加方便
- 缺点
- 命令太多导致过度的命令类