设计模式之命令模式

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 结束。
原文地址:https://www.cnblogs.com/guobm/p/10183480.html