[设计模式]行为模式-命令模式(C++描述)
second60 20180601
1. 命令模式定义
命令模式通过将请求封装到一个commond对象中,并将请求的接受者存放到receiver中, 从而实现调用操作的对象和操作的具体实现者之间的解耦。
命令模式又称为动作模式或事务模式。
通常情况下,消息封装好后直接调用处理接口,这是直接调用。而命令模式把消息封装和消息调用两者分离,两者之间不用关心对方,采用的是回调的思想。
2. 命令模式结构图
命令父类Command: 声明命令类的抽象接口。
具体命令ConcreteCommand: 定义一个接受者和行为之间的弱耦合。实现execute()方法,负责调用接收的相应操作。
接收者Reveiver: 负责具体实施和执行一个请求。
请求者Invoker: 负责调用命令对象执行请求。
3. 代码
// 接收者 class Reciever { public: Reciever(); ~Reciever(); void Action(){} }; // 命令抽象类 class Command { public: virtual ~Command(); virtual void Excute() = 0; // 命令的执行方法 protected: Command(); }; // 具体的命令类 // 里面包含一个接收者 class ConcreteCommand: public Command { public: ConcreteCommand(Reciever* rev):_rev(rev){} ~ConcreteCommand(){delete this->_rev;} void Excute(){ _rev->Action(); } private: Reciver* _rev; }; // 具体的执行类 class Invoker { public: Invoker(Command* cmd){_cmd = cmd;} ~Invoker(){delete _cmd;} void Invoke(){_cmd_Excute();} private: Command* _cmd; } int main() { Reciever* rev = new Reciever(); Command* cmd = new ConcreteCommand(rev); Invoker* inv = new Invoker(cmd); inv->Invoke(); return 0; }
4 使用场景
1 Multi-level undo(多级undo操作)
2 Transactional behavior(原子事务行为)
3 Progress bars(状态条)
4 Wizards(导航)
5 GUI buttons and menu items(GUI按钮与菜单条等等)
6 Thread pools(线程池)
7 Macro recording(宏纪录)
5 优缺点
优点:
1) 降低系统的耦合度:Command模式将调用操作的对象与知道如何实现该操作的对象解耦。
2) Command容易扩展,新加一个命令,继续实现即可。
3) 组合命令:你可将多个命令装配成一个组合命令,即可以比较容易地设计一个命令队列和宏命令。一般说来,组合命令是Composite模式的一个实例。
4) 增加新的Command很容易,因为这无需改变已有的类。
5)可以方便地实现对请求的Undo和Redo。
缺点:
使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。(其实也算不上什么缺点,大部份设计模式都有这样的问题,但系统的扩展性相比少内个类更重要)
6 总结
1)命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
2)每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作
3)命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
4)命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
5)命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。