zoukankan      html  css  js  c++  java
  • 大话设计模式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!!
    "), 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
    ");
    		Notify(_T("Boss Come"));
    	};
    
    	void	Leave()
    	{
    		_tprintf("Boss: Good bye, boys
    ");
    		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都会同时收到同样的消息通知,这实际上就是观察者模式的典型运用,此时的消息就是一个被观察者的通知事件,而手机端和电脑端则是一个观察者对象,当然,这里的情况要稍微复杂些,需要匹配消息发送者和接受者的对象,决定哪些对象是否需要通知,不然一个人和妹子聊得激情四射的时候,就浑然不知在被现场直播中了。

    本文为博主原创文章,如需转载请说明转至http://www.cnblogs.com/organic/
  • 相关阅读:
    作为计算机专业的过来人:想学好C 语言,你必须要知道这3个原因(强烈推荐)
    C语言从1972年诞生至今,能够恒久不衰,是怎么做到的?
    这4种胜过C语言的 C++ 强制转换方法,真的好用到爆...(建议收藏)
    一纸学历证书真的胜过多年工作经验吗?HR更看重程序员什么地方?
    《个人-GIT使用方法》
    java Comparable 和 Cloneable接口
    Java 文本I/O 处理
    java 异常处理
    java的一维数组
    java中String类型
  • 原文地址:https://www.cnblogs.com/organic/p/5005640.html
Copyright © 2011-2022 走看看