Subject+Observers=Observer Pattern
观察者模式定义:
对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会自动获得通知
观察者模式应用:
主题对象只与观察者基类有耦合
客户配置观察者的数量与类型
Observers首先要知道Subject,然后把自己注册到Subject中
Subject保存所有注册过的Observer,当状态发生变化时,广播给所有注册过的观察者
Subject可以采用push或者pull的方式没有Observer交流信息
class Observer;
class Subject//抽象类 主题
{
public:
virtual void registerObserver(Observer*)=0;
virtual void removeObserver(Observer*)=0;
virtual void notifyObserver()=0;
};
class Observer//抽象类 观察者
{
public:
virtual void update(int)=0;
};
class ConcreteSubject:public Subject//具体主题
{
private:
list<Observer*> observers;
int val=0;
public:
void registerObserver(Observer* o){observers.push_back(o);}//观察者订阅
void removeObserver(Observer* o) { observers.remove(o); }//观察者取消订阅
void notifyObserver()//通知观察者
{
for (auto it = observers.begin(); it != observers.end(); it++)
(*it)->update(this->val);
}
void updateVal(int val)
{
cout << "The DOW is now " << val <<"."<< endl;
this->val = val;
notifyObserver();
}
};
class ConcreteObserver :public Observer//具体观察者
{
private:
int val=0;
string name;
public:
ConcreteObserver(string name)
{
this->name = name;
}
void update(int val)
{
//val下降超过2000
if (this->val - val > 2000)
{
cout << name <<" know that Trump was sent to the sun." <<endl;
}
this->val = val;
}
};
int main()
{
ConcreteSubject* DOW = new ConcreteSubject;//具体主题 道琼斯指数
ConcreteObserver* MelonEater1 = new ConcreteObserver("MelonEater1");//具体观察者 吃瓜群众1号
ConcreteObserver* MelonEater2 = new ConcreteObserver("MelonEater2");//具体观察者 吃瓜群众2号
DOW->updateVal(32200);//道琼斯指数更新
DOW->registerObserver(MelonEater1);//吃瓜群众1号关注主题
DOW->updateVal(30000);
DOW->updateVal(27800);//下降超过2000点,通知吃瓜群众,川建国向太阳发射
DOW->registerObserver(MelonEater2);//吃瓜群众2号关注主题
DOW->updateVal(28000);
DOW->updateVal(25500);
DOW->removeObserver(MelonEater1);//吃瓜群众1号取消关注主题
DOW->updateVal(23200);
}
运行结果
The DOW is now 32200.
The DOW is now 30000.
The DOW is now 27800.
MelonEater1 know that Trump was sent to the sun.
The DOW is now 28000.
The DOW is now 25500.
MelonEater1 know that Trump was sent to the sun.
MelonEater2 know that Trump was sent to the sun.
The DOW is now 23200.
MelonEater2 know that Trump was sent to the sun.