观察者模式

发布者作为参数传递给订阅者。 订阅者加入发布者的维护列表中(注册) 发布者更新内容会通知所有的订阅者

#include <iostream>
#include <list>
using std::cout;
using std::endl;
using std::cin;



class Observer
	{
	public:
		virtual ~Observer() {};
		virtual void Update(int) = 0;
	};




	class Subject
	{
	public:
		virtual ~Subject() {};
		virtual void Attach(Observer*) = 0;
		virtual void Detach(Observer*) = 0;
		virtual void Notify() = 0;
	};


	class ConcreteObserver : public Observer
	{
	private:
		Subject *_pSubject;

	public:
		ConcreteObserver(Subject* pSubject) :_pSubject(pSubject)
		{
			//在目标中注册当前观察者(此处的观察者是广义上的观察者,目标并不知道具体谁要观察它,目标只进行广播即可)
			this->_pSubject->Attach(this);
			cout << "I'm the observer \" 1 \".\n";
		}

		void Update(int value) override
		{
			cout << "ConcreteObserver get the update.New State:" << value << endl;
		}
	};



	class ConcreteObserver2 : public Observer
	{
	private:
		Subject *_pSubject;

	public:
		ConcreteObserver2(Subject* pSubject) :_pSubject(pSubject)
		{
			//在目标中注册当前观察者(此处的观察者是广义上的观察者,目标并不知道具体谁要观察它,目标只进行广播即可)
			this->_pSubject->Attach(this);
			cout << "I'm the observer \" 2 \".\n";
		}

		void Update(int value) override
		{
			cout << "ConcreteObserver2 get the update.New State:" << value << endl;
		}
	};


	class ConcreteSubject :public Subject
	{
	private:
		std::list<Observer*> _pObserverList;
		int _iState;
	public:
		void SetState(int state)
		{
			_iState = state;
		}

		void Attach(Observer* pObserver) override
		{
			_pObserverList.push_back(pObserver);
		}


		void Detach(Observer* pObserver) override
		{
			_pObserverList.remove(pObserver);
		}


		void Notify() override
		{
			auto begin = _pObserverList.begin();
			auto end = _pObserverList.end();
			while (begin != end)
			{
				(*begin)->Update(_iState);
				begin++;
			}
		}
	};

int main()
{
	//创建目标
	ConcreteSubject *pSubject = new ConcreteSubject();

	//创建观察者
	Observer *pObserver = new ConcreteObserver(pSubject);
	Observer *pObserver2 = new ConcreteObserver2(pSubject);

	//改变当前状态
	pSubject->SetState(2);

	//广播给所有广义上的观察者
	pSubject->Notify();

	//去除某个观察者
	pSubject->Detach(pObserver);

	//改变当前状态
	pSubject->SetState(3);

	//重新广播
	pSubject->Notify();


	//结束,释放对象
	delete pObserver;
	delete pObserver2;
	delete pSubject;
	return 0;
}
Table of Contents