观察者模式

引述自CSDN 刘伟技术博客http://blog.csdn.net/LoveLion

  1 #include <iostream>
 2 #include <string.h>
 3 using namespace std; 4 5 class AllyControlCenter; 6 //抽象观察类 7 class Observer 8 { 9 public: 10 virtual char* getName(void) const = 0; 11 virtual void setName(const char *str) = 0; 12 virtual void help(void) = 0; //声明支援盟友方法 13 virtual void beAttacked(AllyControlCenter* acc) = 0; //声明遭受攻击方法 14 virtual ~Observer(void){} 15 }; 16 17 //战队控制中心类:目标类 18 class AllyControlCenter 19 { 20 protected: 21 char *allyName;//战队名称 22 Observer* array[10];//定义一个集合用于存储战队成员 23 24 public: 25 AllyControlCenter(void): allyName(NULL) 26 { 27 int size = sizeof(array) / sizeof(array[0]); 28 int i = 0; 29 while(i < size) 30 array[i++] = NULL; 31 } 32 33 void setAllyName(const char* str) 34 { 35 if(allyName) 36 delete[]allyName; 37 allyName = new char[strlen(str) + 1]; 38 strcpy(allyName, str); 39 } 40 41 //注册方法 42 void join(Observer* obs) 43 { 44 int size = sizeof(array) / sizeof(array[0]); 45 int i = 0; 46 while(i < size) 47 { 48 if(array[i] == NULL) 49 break; 50 i++; 51 } 52 if(i < size) 53 array[i] = obs; 54 } 55 56 //注销方法 57 void quit(Observer* obs) 58 { 59 int size = sizeof(array) / sizeof(array[0]); 60 int i = 0; 61 while(i < size) 62 { 63 if(array[i] == obs) 64 break; 65 i++; 66 } 67 if(i < size) 68 { 69 cout << obs->getName() << " quit " << allyName << " ally" << endl; 70 array[i] = NULL; 71 } 72 } 73 74 //声明抽象通知方法 75 virtual void notifyObserver(const char *str) = 0; 76 virtual ~AllyControlCenter(void) 77 { 78 if(allyName) 79 delete[]allyName; 80 allyName = NULL; 81 } 82 }; 83 84 //具体战队控制中心类:具体目标类 85 class ConcreteAllyControlCenter: public AllyControlCenter 86 { 87 public: 88 ConcreteAllyControlCenter(const char *str) 89 { 90 if(allyName) 91 delete[] allyName; 92 allyName = new char[strlen(str) + 1]; 93 strcpy(allyName, str); 94 cout << allyName << " composite done!" << endl; 95 cout << "---------------------" << endl; 96 } 97 98 //实现通知方法 99 void notifyObserver(const char *name) 100 { 101 cout << allyName << " emergency, friends " << name << " being attacked!" << endl; 102 int size = sizeof(array) / sizeof(array[0]); 103 int i = 0; 104 //遍历观察者集合,调用每一个盟友(自己除外)的支援方法 105 while(i < size) 106 { 107 if(array[i] == NULL) 108 { 109 i++; 110 continue; 111 } 112 113 if(strcmp(array[i]->getName(), name) == 0) 114 { 115 i++; 116 continue; 117 } 118 119 array[i]->help(); 120 i++; 121 } 122 } 123 }; 124 125 //战队成员类:具体观察者类 126 class Player: public Observer 127 { 128 private: 129 char *name; 130 131 public: 132 Player(const char *str): name(NULL) 133 { 134 if(name) 135 delete[]name; 136 name = new char[strlen(str) + 1]; 137 strcpy(name, str); 138 } 139 140 void setName(const char *str) 141 { 142 if(name) 143 delete[]name; 144 name = new char[strlen(str) + 1]; 145 strcpy(name, str); 146 } 147 148 char* getName(void) const 149 { 150 return name; 151 } 152 153 //支援盟友方法 154 void help(void) 155 { 156 cout << "persist! " << name << " will help you" << endl; 157 } 158 159 //遭受攻击方法的实现,当遭受攻击时将调用战队中心类的通知方法notifyObserver()来通知盟友 160 void beAttacked(AllyControlCenter* acc) 161 { 162 cout << name << " being attacked" << endl; 163 acc->notifyObserver(name); 164 } 165 ~Player(void) 166 { 167 if(name) 168 delete[]name; 169 name = NULL; 170 } 171 }; 172 173 int main(void) 174 { 175 AllyControlCenter* acc = NULL; 176 acc = new ConcreteAllyControlCenter("302"); 177 178 Observer *player1 = new Player("zhou"); 179 acc->join(player1); 180 181 Observer *player2 = new Player("fu"); 182 acc->join(player2); 183 184 Observer *player3 = new Player("wang"); 185 acc->join(player3); 186 187 Observer *player4 = new Player("fang"); 188 acc->join(player4); 189 190 player1->beAttacked(acc); 191 192 delete player4; 193 delete player3; 194 delete player2; 195 delete player1; 196 delete acc; 197 return 0; 198 }
原文地址:https://www.cnblogs.com/openix/p/3119859.html