#include <iostream>
#include <string>
#include <list>
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<Observer*> 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;
}
结果: