设计模式——命令模式(C++实现)

      

    

  1 [root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp
  2 #include <iostream>
  3 #include <string>
  4 #include <vector>
  5 #include <algorithm>
  6 #include <iterator>
  7 
  8 using namespace std;
  9 
 10 class Receiver
 11 {
 12 public:
 13         void BakeMutton()
 14         {
 15                 cout<< "烤羊肉"<< endl;
 16         }
 17 
 18         void BakeChicken()
 19         {
 20                 cout<< "烤鸡翅"<< endl;
 21         }
 22 };
 23 
 24 class Command
 25 {
 26 public:
 27         Command(Receiver* pstReceiver):m_pstReceiver(pstReceiver)
 28         {
 29 
 30         }
 31         virtual void Excute() = 0;
 32 
 33 protected:
 34         Receiver* m_pstReceiver;
 35 };
 36 
 37 class ConcreteCommandA: public Command
 38 {
 39 public:
 40         ConcreteCommandA(Receiver* pstReceiver):Command(pstReceiver)
 41         {
 42 
 43         }
 44         virtual void Excute()
 45         {
 46                 cout<< "ConcreteCommandA excuting......"<< endl;
 47                 m_pstReceiver->BakeMutton();
 48         }
 49 
 50 };
 51 
 52 class ConcreteCommandB: public Command
 53 {
 54 public:
 55         ConcreteCommandB(Receiver* pstReceiver):Command(pstReceiver)
 56         {
 57 
 58         }
 59         virtual void Excute()
 60         {
 61                 cout<< "ConcreteCommandB excuting......"<< endl;
 62                 m_pstReceiver->BakeChicken();
 63         }
 64 };
 65 
 66 class Invoke
 67 {
 68 public:
 69         void Add(Command* pstCommand)
 70         {
 71                 m_vecPstCommand.push_back(pstCommand);
 72         }
 73         void Remove(Command* pstCommand)
 74         {
 75                 m_vecPstCommand.erase(find(m_vecPstCommand.begin(), m_vecPstCommand.end(), pstCommand));
 76         }
 77         void RemoveAll()
 78         {
 79                 m_vecPstCommand.clear();
 80         }
 81         void Notify()
 82         {
 83                 for (typeof(m_vecPstCommand.begin()) it = m_vecPstCommand.begin(); it != m_vecPstCommand.end(); ++it)
 84                 {
 85                         (*it)->Excute();
 86                 }
 87         }
 88 
 89 private:
 90         vector<Command*> m_vecPstCommand;
 91 };
 92 
 93 int main(int argc, char* argv[])
 94 {
 95         Receiver* pstReceiver = new Receiver();
 96         Command* pstConcreteCommandA = new ConcreteCommandA(pstReceiver);
 97         Command* pstConcreteCommandB = new ConcreteCommandB(pstReceiver);
 98         Invoke* pstInvoke = new Invoke();
 99 
100         pstInvoke->Add(pstConcreteCommandA);
101         pstInvoke->Add(pstConcreteCommandA);
102         pstInvoke->Add(pstConcreteCommandB);
103         pstInvoke->Notify();
104         cout<< "------------------"<< endl<< endl;
105 
106         pstInvoke->Remove(pstConcreteCommandA);  //撤销操作
107         pstInvoke->Remove(pstConcreteCommandB);
108         pstInvoke->Notify();
109         cout<< "------------------"<< endl<< endl;
110 
111         return 0;
112 }
113 ////////////////////////////////////////
114 [root@ ~/learn_code/design_pattern/19_order]$ ./order
115 ConcreteCommandA excuting......
116 烤羊肉
117 ConcreteCommandA excuting......
118 烤羊肉
119 ConcreteCommandB excuting......
120 烤鸡翅
121 ------------------
122 
123 ConcreteCommandA excuting......
124 烤羊肉
125 ------------------
原文地址:https://www.cnblogs.com/070412-zwc/p/6891274.html