C/Cpp / 设计模式 / 观察者模式

---------------------------------------------
-- 时间:2019-03-22
-- 创建人:Ruo_Xiao
-- 邮箱:xclsoftware@163.com
---------------------------------------------

一、解释

1、结构:分为目标和观察者。

2、功能:当目标更新时,该模式可以将该更新内容发布给所有的该目标的观察者。

3、实际上,目标通过抽象类得到观察者的接口,然后在其内建立观察者的链表,当发布时直接按照同一个接口(面向接口编程)向所有的观察者的更新。

二、代码

#include <iostream>
#include <list>
using namespace std;

//	观察者……抽象类
class Observe
{
public:
	virtual void Update(int i) = 0;
	virtual void Attach() = 0;
	virtual void Detach() = 0;
};

//	目标……抽象类
class Subject
{
public:
	virtual void Attach(Observe *p) = 0;
	virtual void Detach(Observe *p) = 0;
	virtual void Notify() = 0;
};

//	建立3个观察者、1个目标
class Observe_1 : public Observe
{
public:
	Observe_1(Subject *p)
	{
		m_pSubject = p;
	}
public:
	void Attach()
	{
		m_pSubject->Attach(this);
	}
	void Detach()
	{
		m_pSubject->Detach(this);
	}
	void Update(int i)
	{
		cout<<"I am observe 1,showing "<< i <<endl;
	}
private:
	Subject *m_pSubject;
};

class Observe_2 : public Observe
{
public:
	Observe_2(Subject *p)
	{
		m_pSubject = p;
	}
public:
	void Attach()
	{
		m_pSubject->Attach(this);
	}
	void Detach()
	{
		m_pSubject->Detach(this);
	}
	void Update(int i)
	{
		cout<<"I am observe 2,showing "<< i <<endl;
	}
private:
	Subject *m_pSubject;
};

class Observe_3 : public Observe
{
public:
	Observe_3(Subject *p)
	{
		m_pSubject = p;
	}
public:
	void Attach()
	{
		m_pSubject->Attach(this);
	}
	void Detach()
	{
		m_pSubject->Detach(this);
	}
	void Update(int i)
	{
		cout<<"I am observe 3,showing "<< i <<endl;
	}
private:
	Subject *m_pSubject;
};

class Subject_All : public Subject
{
public:
	void Attach(Observe *p)
	{
		pObserverList.push_back(p);
	}
	void Detach(Observe *p)
	{
		pObserverList.remove(p);
	}
	void Notify()
	{
		list<Observe *>::iterator it = pObserverList.begin();
		for (;it!=pObserverList.end();++it)
		{
			(*it)->Update(iState_All);
		}
	}

	void SetState(int iState)
	{
		iState_All = iState;
	}
private:
	list<Observe *> pObserverList;
	int iState_All;
};

int main()
{
	// Create Subject
	Subject_All *pSubject = new Subject_All();

	// Create Observer
	Observe_1 *pObserver1 = new Observe_1(pSubject);
	Observe_2 *pObserver2 = new Observe_2(pSubject);
	Observe_3 *pObserver3 = new Observe_3(pSubject);

	// Change the state
	pSubject->SetState(2);

	// Register the observer
	pObserver1->Attach();
	pObserver2->Attach();
	pObserver3->Attach();

	pSubject->Notify();

	// Unregister the observer
	pObserver3->Detach();

	pSubject->SetState(3);
	pSubject->Notify();

	delete pObserver1;
	delete pObserver2;
	delete pObserver3;
	delete pSubject;

	cin.get();
}

结果:

(SAW:Game Over!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值