观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式。
   这里以大话设计模式中的例子为例,办公室员工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都会同时收到同样的消息通知,这实际上就是观察者模式的典型运用,此时的消息就是一个被观察者的通知事件,而手机端和电脑端则是一个观察者对象,当然,这里的情况要稍微复杂些,需要匹配消息发送者和接受者的对象,决定哪些对象是否需要通知,不然一个人和妹子聊得激情四射的时候,就浑然不知在被现场直播中了。

大话设计模式C++版——观察者模式的更多相关文章

  1. 大话设计模式C++版——代理模式

    本篇开始前先发个福利,程杰的<大话设计模式>一书高清电子版(带目录)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gufeng9 ...

  2. 大话设计模式C++版——工厂模式在COM中的典型应用

    上篇<大话设计模式C++版——抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案——COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式 ...

  3. 大话设计模式C++版——抽象工厂模式

    前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...

  4. 大话设计模式C++版——工厂方法模式

    工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...

  5. 大话设计模式C++版——表驱动法改造简单工厂

    上回<大话设计模式C++版——简单工厂模式>中指出了简单工厂模式的缺陷,即违背了开发—封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码 ...

  6. 大话设计模式C++版——简单工厂模式

    简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...

  7. 大话设计模式C++版——原则和引言

    转贴请注明转自:http://blog.csdn.net/gufeng99/article/details/45832711 读程杰的<大话设计模式>有一段时间了,将其C#版的设计模式代码 ...

  8. 大话设计模式C++版——装饰模式

    女人常说男人喜新厌旧,只见新人笑,那闻旧人哭,但装饰模式(Decorator)却是一种结交新朋友不忘老朋友的设计模式,非常适合去古代当老公(现代是不行的,因为只能娶一个老婆了).装饰模式的本质是每一个 ...

  9. 大话设计模式Python实现-观察者模式

    观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更 ...

随机推荐

  1. Webform(Linq高级查、分页、组合查询)

    一.linq高级查 1.模糊查(包含) 1 public List<User> Select(string name) 2 { 3 return con.User.Where(r => ...

  2. 第一次写jquery插件,来个countdown计时器吧

    之前同学做个购物商城秒杀活动需要计时器的功能,在用jquery提供的countdown插件时,一直报错,貌似还需要依赖除jquery之外的其他插件,搞了半天也没搞成功,就叫我帮忙写个.然而我并没有写过 ...

  3. VMware虚拟机无法访问外网

    1.环境条件 2.VMware检查 3.虚拟机检查 1) vi /etc/sysconfig/network ----------------------------- NETWORKING=yes ...

  4. SharePoint 2013 关于自定义显示列表表单的bug

    1.在SharePoint 2013中,我们隐藏列表Dispform页面的ListFormWebPart部件,转而使用自定义显示列表表单进行展示,因为这样更容易定制我们需要的显示: 2.之后发现文件夹 ...

  5. Android悬浮窗实现 使用WindowManager

    Android悬浮窗实现 使用WindowManager WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得  ...

  6. UIWebView的应用和其中的JS与OC间传值

    现在有很多的应用已经采用了WebView和html语言结合的开发模式.html5一直很火因为一份代码可以在多个平台上运用啊,效果各不相同都很美观,也越来越有一些公司直接招后台程序员和html5程序员, ...

  7. iOS自动布局进阶用法

    本文主要介绍几个我遇到并总结的相对高级的用法(当然啦牛人会觉得这也不算什么). 简单的storyboard中上下左右约束,固定宽高啥的用法在这里就不做赘述了. autolayout自动布局是iOS6以 ...

  8. mac 终端(terminal) 启动tomcat

    mac 终端启动tomcat: 找到你的tomcat安装的根目录:找到bin目录,在终端 cd 到这个bin中,输入sudo ./startup.sh (然后终端会提示你输入本机密码如果是在需要权限的 ...

  9. location of the android sdk has not been setup in the preferences

    点eclipse的android virtual device manager提示错误:error:location of the android sdk has not been setup in ...

  10. OBST(Optimal Binary Tree最优二叉搜索树)

    二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 ...