行为型模式之命令模式
程序员文章站
2022-05-18 18:20:56
命令模式(Command Pattern)又称为行动(Action)模式或交易(Transaction)模式。 定义: 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能。 命令模式类图如下所示。 命令模式中有如下4个角色。 命令( ......
命令模式(command pattern)又称为行动(action)模式或交易(transaction)模式。
定义:
- 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能。
命令模式类图如下所示。
命令模式中有如下4个角色。
- 命令(command)角色:声明一个所有具体命令类的抽象接口,定义需要执行的命令。
- 具体命令(concrete command)角色:定义一个接收者和行为之间的弱耦合,实现命令方法,并调用接收者的相应操作。
- 调用者(invoker)角色:负责调用命令对象执行请求。
- 接收者(receiver)角色:负责具体实施和执行一个请求。
command.java
public interface command { // 执行命令的方法 public void execute(); }
concretecommand.java
public class concretecommand implements command{ private receiver receiver; public concretecommand(receiver receiver) { this.receiver = receiver; } // 执行方法 @override public void execute() { this.receiver.action(); } }
receiver.java
public class receiver { // 行动方法 public void action() { system.out.println("执行动作"); } }
invoker.java
public class invoker { private command command; // 接收命令 protected void setcommand(command command) { this.command = command; } // 执行命令 public void action() { this.command.execute(); } }
client.java
public class client { public static void main(string[] args) { // 调用者 invoker invoker = new invoker(); // 接收者 receiver receiver = new receiver(); // 定义一个发送给接收者的命令 command command = new concretecommand(receiver); // 执行 invoker.setcommand(command); invoker.action(); } }
优点:
- 类间解绑。调用者角色与接收者角色之间没有任何依赖,调用者实现功能时只需调用command中的execute()方法即可,不需要了解是哪个接收者执行。
- 可扩展性。command的子类可以非常容易地扩展,而调用者invoker和高层次的模块client不产生严重的代码耦合。
- 命令模式结合其他模式会更优秀。命令模式可以结合责任链模式,实现命令族解析任务,结合模板实现方法,则可以减少command子类的膨胀问题。
缺点:
- 可能会导致系统中出现过多的具体命令类,因此需要在项目中慎重考虑使用。
应用场景:
-
只要你认为是命令的地方就可以采用命令模式,例如,在gui开发中,一个按钮的点击
是一个命令,可以采用命令模式;模拟dos命令的时候,当然也要采用命令模式;触发-反
馈机制的处理等。
摘自:
青岛东合信息技术有限公司 . 设计模式(java版) . 电子工业出版社,2012,142-146.
秦小波 . 设计模式之禅 . 机械工业出版社, 2014
上一篇: VSCode瞎折腾记