命令模式

命令模式定义

命令模式(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

 

posted on 2014-12-06 20:17  xiaoheike  阅读(231)  评论(0)    收藏  举报

导航