大话设计模式C++版——观察者模式

   观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式。
   这里以大话设计模式中的例子为例,办公室员工A、B、C在看股票看电影,这时老板回来了,被A、B、C重金贿赂后的前台MM发出通知给A、B、C,A、B、C收到通知后赶紧关电脑,关股票窗口,装作在干活。

1、观察者接口
class IObserver
{
public:
	virtual	~IObserver() {}
	
	virtual	void	OnEvent(TString tstrEvent) = 0;
};
2、具体观察者类
class CObserver : public IObserver
{
public:
	CObserver(TString tstrObserver) : m_tstrName(tstrObserver)  {}
	virtual	~CObserver() {}
	
	virtual	void	OnEvent(TString tstrEvent)
	{
		_tprintf(_T("%s get %s event!!\n"), m_tstrName.c_str(), tstrEvent.c_str());
	}

private:
	TString	m_tstrName;
};
3、被观察者类,由被观察者具体对象继承,有添加和删除观察者对象接口,当收到通知时挨个通知list中所有的观察者对象
class CBase_ObserveObject
{
public:
	CBase_ObserveObject() {}
	virtual	~CBase_ObserveObject() {}

	BOOL	AddObserver(IObserver* poCObserver)
	{
		if (poCObserver)
		{
			m_listObserver.push_back(poCObserver);
			return	TRUE;
		}

		return	FALSE;
	}

	void	DelObserver(IObserver* poCObserver)
	{
		m_listObserver.remove(poCObserver);
	}

	int		Notify(TString	tstrEvent)
	{
		if (!m_listObserver.empty())
		{
			std::list<IObserver*>::iterator itObserer;

			for (itObserer = m_listObserver.begin(); itObserer != m_listObserver.end(); 

itObserer++)
			{
				IObserver* poObserver = *itObserer;			
				poObserver->OnEvent(tstrEvent);
			}
		}

		return	m_listObserver.size();
	}

private:
	std::list<IObserver*> m_listObserver;
};
4、被观察者具体对象,发出事件通知
class CBoss : public CBase_ObserveObject
{
public:
	void	Come()
	{
		_tprintf("Boss: Ha Ha, boys, I come in\n");
		Notify(_T("Boss Come"));
	};

	void	Leave()
	{
		_tprintf("Boss: Good bye, boys\n");
		Notify(_T("Boss Leave"));
	}
};

5、使用示例

void ObserveTest()
{
	CObserver	oCOberver1(_T("Viki")), oCOberver2(_T("Jim"));
	CBoss	oCBoss;
	
	oCBoss.AddObserver(&oCOberver1);
	oCBoss.AddObserver(&oCOberver2);
	
	oCBoss.Come();
	
	//删除oCOberver1观察者对象,这时当老板离开后,oCOberver1就收不到通知了
	oCBoss.DelObserver(&oCOberver1);

	oCBoss.Leave();
}
运行结果如下:


    我们在QQ聊天时,有时会电脑上挂一个QQ,然后手机上又挂一个,当收到朋友消息时,我们手机和电脑上的QQ都会同时收到同样的消息通知,这实际上就是观察者模式的典型运用,此时的消息就是一个被观察者的通知事件,而手机端和电脑端则是一个观察者对象,当然,这里的情况要稍微复杂些,需要匹配消息发送者和接受者的对象,决定哪些对象是否需要通知,不然一个人和妹子聊得激情四射的时候,就浑然不知在被现场直播中了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值