1 概念
命令模式属于行为模式,目的将一个请求封装成一个对象。客户端只管发一条或是多条命令或请求,不需要关注接收者是谁,以及如何实现。
2 适用场景和优缺点
适用场景:客户端需要不同时间,发送不同指令;客户端和接受者解藕;系统需要支持undo redo操作。
优点:扩展性强,便于组合命令。
3 命令模式解读
抽象命令Command :定义命令的接口或是抽象类,用于声明执行的execute方法。
具体命令:实现抽象命令,接收接收者指令,并调用接收者的action()方法来完成命令需要执行的操作。
接收者Receiver :实现具体命令,action()
调用者Invoker:持有一个或多个命令对象,同时执行命令对象的execute()。
客户端Client:创建具体的命令,和接收者,然后给具体命令设置接收者,给调用者设置命令对象,并执行调用者方法执行操作。
4 实现示例
1 package Command;
2
3 /**
4 * 抽象命令Command
5 */
6 public abstract class Command {
7 protected void execute() {
8 }
9 }
1 package Command;
2
3 /**
4 * 具体命令
5 */
6 public class CommandHandle extends Command {
7
8 private Receiver receiver;
9 private String foodName;
10
11 public CommandHandle(Receiver receiver, String foodName) {
12 this.receiver = receiver;
13 this.foodName = foodName;
14 }
15
16 @Override
17 protected void execute() {
18 receiver.action(foodName);
19 }
20 }
1 package Command;
2
3 /**
4 * 接收者Receiver
5 */
6 public class Receiver {
7 public void action(String foodName) {
8 System.out.println("接收者Receiver 开始。");
9 if ("红烧排骨".equals(foodName)) {
10 System.out.println(foodName + "需要准备排骨和胡萝卜。");
11 }
12 else if ("酱肉丝".equals(foodName)) {
13 System.out.println(foodName + "需要准备精瘦肉和大葱。");
14 }
15 else {
16 System.out.println(foodName + ":食材不足。");
17 }
18 System.out.println("接收者Receiver 结束。");
19 }
20 }
1 package Command;
2
3 /**
4 * 客户端Client
5 */
6 public class Client {
7 public static void main(String[] args) {
8 Receiver receiver = new Receiver();
9 Invoker invoker = new Invoker();
10 Command command1 = new CommandHandle(receiver, "红烧排骨");
11 Command command2 = new CommandHandle(receiver, "酱肉丝");
12 invoker.setCommand(command1);
13 invoker.setCommand(command2);
14 invoker.doInvoke();
15 }
16 }
运行结果:
接收者Receiver 开始。
红烧排骨需要准备排骨和胡萝卜。
接收者Receiver 结束。
接收者Receiver 开始。
酱肉丝需要准备精瘦肉和大葱。
接收者Receiver 结束。