《设计模式之禅》学习笔记(十五)
命令模式的定义:
Encapsulat a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)
命令模式的通用类图:
三种角色:
- Receiver 接受者角色,命令传递到这里被执行。
- Command 命令角色,需要执行的所有命令都在这里声明。
- Invoker 调用者角色,接受到命令,并执行命令。
通用代码:
public abstract class Receiver { // 抽象接受者,定义每个接受者都必须完成的任务 public abstract void doSomething(); } public class ConcreteReceiver1 extends Receiver { @Override public void doSomething() { } } public class ConcreteReceiver2 extends Receiver { @Override public void doSomething() { } } public abstract class Command { protected final Receiver receiver; public Command(Receiver receiver) { this.receiver = receiver; } public abstract void execute(); } public class ConcreteCommand1 extends Command { // 声明自己的默认接收者,这样高层次模块(调用者)就不需要知道接受者是谁 public ConcreteCommand1() { super(new ConcreteReceiver1()); } // 构造函数传递接收者 public ConcreteCommand1(Receiver receiver) { super(receiver); } @Override public void execute() { // 业务处理 this.receiver.doSomething(); } } public class ConcreteCommand2 extends Command { // 声明自己的默认接收者 public ConcreteCommand2() { super(new ConcreteReceiver2()); } // 构造函数传递接收者 public ConcreteCommand2(Receiver receiver) { super(receiver); } @Override public void execute() { // 业务处理 this.receiver.doSomething(); } } public class Invoker { private Command command; // 接收命令 public void setCommand(Command command) { this.command = command; } // 执行命令 public void action() { this.command.execute(); } } public class Client { public static void main(String[] args) { // 声明调用者Receiver Invoker invoker = new Invoker(); // 定义一个发送给接受者的命令 Command command = new ConcreteCommand1(); // 把命令交给调用者去执行 invoker.setCommand(command); invoker.action(); } }
命令模式的优点:
- 类间解耦
- 可扩展性
- 命令模式结合其他模式会更优秀
命令模式的缺点:
类膨胀