一、概念
本质是一种数据驱动、事件驱动的设计模式。
1.1、定义
又称为动作(Action)模式或事务(Transaction)模式。将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
- Receiver,接收者类:封装命令的执行过程
- Command,命令类抽象:对命令的封装,其需要指定接收者Receiver
- Invoker,调用者类:封装命令的实际调用者,执行的时候需要指定具体的ConcreteCommand
- ConcreteCommand,具体命令类
1.2、解决的问题
- 问题分析:存在这样一种场景,派发一个事件Event,执行对应的动作。即
- 模式的解决思路:将「命令Command」的「调用者Invoker」和「接收者Receiver」隔离解耦,命令、调用者、接收者彼此独立变化。
命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
二、模式的应用和优缺点
2.1、应用场景
- 实例:
struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
2.2、优缺点
优点
降低系统的耦合度
新的命令可以很容易地加入到系统中
可以比较容易地设计一个命令队列和宏命令(组合命令)
可以方便地实现对请求的Undo和Redo缺点
可能会导致某些系统有过多的具体命令类,增加系统的复杂性。