#include#include #include using namespace std; //通知者抽象类 class Subject; //观察者抽象类 class Observer { public: Observer(string name, Subject* sub) { this->name = name; this->sub = sub; } virtual void update() = 0; protected: string name; Subject* sub; }; //通知者抽象类 class Subject { public: string action; virtual void attach(Observer*) = 0; virtual void detach(Observer*) = 0; virtual void notify() = 0; protected: list
observers; //观察者列表 }; //具体观察者 class Tower: public Observer { public: Tower(string name, Subject* sub) : Observer(name, sub) { } void update() { cout << name << "收到消息:" << sub->action << endl; if (sub->action == "小兵进塔了") { cout << name << ": 攻击小兵" << endl; } } }; //具体通知者 class Soldier: public Subject { public: void attach(Observer* obs) { observers.push_back(obs); } void detach(Observer* obs) { observers.remove(obs); } void notify() { for (auto it : observers) { it->update(); } } }; int main() { //小兵是一个通知者 Subject* soldier = new Soldier(); //被观察的对象 Observer* A_tower1 = new Tower("防御塔A1", soldier); Observer* A_tower2 = new Tower("防御塔A2", soldier); Observer* B_tower = new Tower("防御塔B", soldier); //把三个塔添加到观察队列中 soldier->attach(A_tower1); soldier->attach(A_tower2); soldier->attach(B_tower); //小兵发起行动,并通知各位观察者 soldier->action = "小兵进塔了"; soldier->notify(); cout << endl; //小兵发起行动,并通知各位观察者 soldier->action = "小兵没进塔"; soldier->notify(); cout << endl; //把A1塔移出观察者队列,小兵发起行动,并通知各位观察者 soldier->detach(A_tower1 ); soldier->action = "小兵进塔了"; soldier->notify(); return 0; }
结果:



