命令模式
命令模式定义
命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式结构图
命令模式结构图如下所示:

图 01 命令模式结构图
命令模式套用代码
1 #include "iostream" 2 using namespace std; 3 4 // 实施具体的操作 5 class Receiver 6 { 7 public: 8 void Action() 9 { 10 cout << "执行请求" << endl; 11 } 12 13 virtual ~Receiver() 14 { 15 16 } 17 }; 18 19 // 执行操作的接口 20 class Command 21 { 22 protected: 23 Receiver* receiver; 24 public: 25 Command(Receiver* receiver) 26 { 27 this->receiver = receiver; 28 } 29 30 virtual void Execute() = 0; 31 32 virtual ~Command() 33 { 34 35 } 36 }; 37 38 // 调用Receiver相应的操作,以实现execute 39 class ConcreteCommand : public Command 40 { 41 public: 42 ConcreteCommand(Receiver* receiver) 43 : Command(receiver) 44 { 45 46 } 47 48 virtual void Execute() 49 { 50 receiver->Action(); 51 } 52 53 virtual ~ConcreteCommand() 54 { 55 56 } 57 }; 58 59 // 要求该命令执行这个请求 60 class Invoker 61 { 62 private: 63 Command* command; 64 public: 65 void SetCommand(Command* command) 66 { 67 this->command = command; 68 } 69 70 virtual void ExecuteCommand() 71 { 72 command->Execute(); 73 } 74 75 virtual ~Invoker() 76 { 77 78 } 79 }; 80 81 void main() 82 { 83 Receiver* r = new Receiver(); 84 Command* c = new ConcreteCommand(r); 85 Invoker* i = new Invoker(); 86 87 i->SetCommand(c); 88 i->ExecuteCommand(); 89 90 delete r; 91 r = NULL; 92 delete c; 93 c = NULL; 94 delete i; 95 i = NULL; 96 }
命令模式特点
① 命令模式能较容易地设计一个命令队列
② 在需要的情况下,可以容易地将命令记入日志
③ 允许接受请求的一方决定是否要否决请求
④ 可以容易地实现对请求的撤销和重做
⑤ 加进新的具体命令类不影响其他的类,因此增加新的集体命令类很容易
⑥ 把请求一个操作的对象与指导怎么执行一个操作的对象分割开
⑦ 敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不需要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。
命令模式实例应用
命令模式实例应用类图

图 02 命令模式实例应用类图
命令模式实例应用代码
1 #include "iostream" 2 using namespace std; 3 #include <list> 4 5 6 // 命令的最终执行类(Receiver) 7 class CBarbecuer 8 { 9 public: 10 void BakeMutton() 11 { 12 cout << "烤羊肉串" << endl; 13 } 14 15 void BakeChickenWing() 16 { 17 cout << "烤鸡翅" << endl; 18 } 19 20 virtual ~CBarbecuer() 21 { 22 23 } 24 }; 25 26 // 抽象命令类 27 class CCommand 28 { 29 protected: 30 CBarbecuer* receiver; 31 public: 32 CCommand(CBarbecuer* receiver) 33 { 34 this->receiver = receiver; 35 } 36 37 virtual void ExecuteCCommand() = 0; 38 39 virtual ~CCommand() 40 { 41 42 } 43 }; 44 45 // 烤羊肉串命令(ConcreteCCommand) 46 class CBakeMuttonCCommand : public CCommand 47 { 48 public: 49 CBakeMuttonCCommand(CBarbecuer* receiver) 50 : CCommand(receiver) 51 { 52 53 } 54 55 virtual void ExecuteCCommand() 56 { 57 receiver->BakeMutton(); 58 } 59 60 virtual ~CBakeMuttonCCommand() 61 { 62 63 } 64 }; 65 66 // 烤鸡翅(ConcreteCCommand) 67 class CBakeChickenWingCCommand : public CCommand 68 { 69 public: 70 CBakeChickenWingCCommand(CBarbecuer* receiver) 71 : CCommand(receiver) 72 { 73 74 } 75 76 virtual void ExecuteCCommand() 77 { 78 receiver->BakeChickenWing(); 79 } 80 81 virtual ~CBakeChickenWingCCommand() 82 { 83 84 } 85 }; 86 87 // 发布命令(Invoker) 88 class CWaiter 89 { 90 private: 91 list<CCommand*> orders; 92 public: 93 void SetOrder(CCommand* command) 94 { 95 orders.push_back(command); 96 cout << "增加订单" << endl; 97 } 98 99 void CancelOrder(CCommand* command) 100 { 101 orders.remove(command); 102 cout << "取消订单" << endl; 103 } 104 105 // 通知Receiver执行相关操作 106 void Notify() 107 { 108 list<CCommand*>::iterator it = orders.begin(); 109 while(it != orders.end()) 110 { 111 (*it)->ExecuteCCommand(); 112 it++; 113 } 114 } 115 116 virtual ~CWaiter() 117 { 118 119 } 120 }; 121 122 void main() 123 { 124 CBarbecuer* boy = new CBarbecuer(); 125 CCommand* bakeMuttonCCommand1 = new CBakeMuttonCCommand(boy); 126 CCommand* bakeMuttonCCommand2 = new CBakeMuttonCCommand(boy); 127 CCommand* CBakeChickenWingCCommand1 = new CBakeChickenWingCCommand(boy); 128 CWaiter* girl = new CWaiter(); 129 130 girl->SetOrder(bakeMuttonCCommand1); 131 girl->SetOrder(bakeMuttonCCommand2); 132 girl->SetOrder(CBakeChickenWingCCommand1); 133 134 girl->Notify(); 135 136 delete boy; 137 boy = NULL; 138 delete bakeMuttonCCommand1; 139 bakeMuttonCCommand1 = NULL; 140 delete bakeMuttonCCommand2; 141 bakeMuttonCCommand2 = NULL; 142 delete CBakeChickenWingCCommand1; 143 CBakeChickenWingCCommand1 = NULL; 144 145 delete girl; 146 girl = NULL; 147 }
2014-12-06 20:20:01
浙公网安备 33010602011771号