定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
——《设计模式》GoF
#include <iostream>
#include <list>
#include <string>
/*
观察者模式
定义对象间的一种一对多(变化)的依赖关系,以便当一个
对象(Subject)的状态发生改变时,所有依赖于它的对象都
得到通知并自动更新。
——《设计模式》GoF
*/
using namespace std;
class Observer
{
public:
Observer() { ; }
virtual ~Observer() { ; }
// 当被观察对象发生变化时,通知被观察者调用这个方法
virtual void Update(void* pArg) = 0;
};
class User1 : public Observer
{
public:
virtual void Update(void* pArg)
{
cout << "User1:" << (char *)pArg << endl;
}
};
class User2 : public Observer
{
public:
virtual void Update(void* pArg)
{
cout << "User2:" << (char *)pArg << endl;
//reinterpret_cast
}
};
class Observerable
{
public:
Observerable() :_bChange(false)
{
}
virtual ~Observerable() {}
// 注册观察者
void Attach(Observer* pOb)
{
_Obs.push_back(pOb);
}
// 反注册观察者
void Detach(Observer* pOb)
{
_Obs.remove(pOb);
}
int GetObseverCount() const
{
return _Obs.size();
}
void DetachAll()
{
_Obs.clear();
}
virtual void GetSomeNews(string str)
{
SetChange(str);
}
protected:
void SetChange(string news) // 有变化,需要通知
{
_bChange = true;
Notify((void*)news.c_str());
}
private:
void Notify(void* pArg)
{
if (_bChange == false) return;
//遍历容器
for (auto itr = _Obs.begin(); itr != _Obs.end(); itr++)
(*itr)->Update(pArg);//遍历调用list容器里面子类的虚函数Update,实现各个子类的运行多态
_bChange = false;
}
private:
bool _bChange;
list<Observer*> _Obs;
};
class News : public Observerable
{
public:
virtual void GetSomeNews(string str)
{
SetChange("News: " + str);
}
};
int main()
{
User1 u1;
User2 u2;
News n1;
n1.GetSomeNews("T0");//发送广播
cout << n1.GetObseverCount() << endl; // 0
n1.Attach(&u1);
n1.Attach(&u2);
n1.GetSomeNews("T1");
cout << n1.GetObseverCount() << endl; // 2
n1.Detach(&u2);
n1.GetSomeNews("T2");
cout << n1.GetObseverCount() << endl; // 1
n1.DetachAll();
n1.GetSomeNews("T3");
cout << n1.GetObseverCount() << endl; // 0
return 0;
}
运行结果
原文:https://www.cnblogs.com/mcreator/p/13425918.html