1. 什么是观察者模式?

  观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

2. 有什么用?

  观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。例如: 游戏里,当玩家触发 Attack ,界面的一系列变化:角色攻击动画播放,怪物倒地,伤害量计算与显示。这些变化都基于玩家 attack 动作。 而这些变化是可以无限扩展的。

3. 程序示例代码

  本程序简单实现了公司里面的一个场景。一群偷懒的员工(observer)趁老板不在,偷偷做自己的私事。不用担心被老板捉到,他们早已通知门口的前台 May(subject),当老板回来后,立马通知他们。一下是本程序的全部代码, linux 下编译运行正常, 注意 本程序用到了 boost库的 shared_ptr 。需要安装Boost库才能正常运行。

 //file name : BaseObserver.h

 #ifndef __BASE_OBSERVER_H__
#define __BASE_OBSERVER_H__ #include <string> #include "BaseSubject.h"
#include <boost/shared_ptr.hpp> using namespace std;
using namespace boost; typedef shared_ptr<BaseSubject> basesubject_t; class BaseObserver    //观察者基类
{
protected :
std::string m_name;
basesubject_t m_sub; public :
BaseObserver();
BaseObserver(std::string name, basesubject_t sub);
virtual void Update()
{
}
}; #endif
 //file name : BaseObserver.cpp

 #include "BaseObserver.h"

 BaseObserver::BaseObserver()
{ } BaseObserver::BaseObserver(std::string name, basesubject_t sub): m_name(name), m_sub(sub)
{ }
 //file name BaseSubject.h

 #ifndef __BASE_SUBJECT_H__
#define __BASE_SUBJECT_H__ #include <list>
#include <string>
#include <boost/shared_ptr.hpp> using namespace std;
using namespace boost; class BaseObserver; typedef shared_ptr<BaseObserver> baseobserver_t; class BaseSubject
{ private :
std::list<baseobserver_t> m_observers; public :
void Attach(baseobserver_t ob); void Detach(BaseObserver* ob); void Notify(); public :
string m_subject_state;
}; #endif
 //file name BaseSubject.cpp

 #include "BaseSubject.h"
#include "BaseObserver.h"
#include <iostream> void BaseSubject::Attach(baseobserver_t ob)
{
m_observers.push_back(ob);
} void BaseSubject::Detach(BaseObserver* ob)
{ } void BaseSubject::Notify()
{
for(std::list<baseobserver_t>::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
{
(*it)->Update();
}
}
 //file name: bossSecretaryWorkers.cpp

 #include <ostream>
#include <list>
#include <string> #include "boost/shared_ptr.hpp" #include "BaseObserver.h"
#include "BaseSubject.h" using namespace std;
using namespace boost; class Secretary : public BaseSubject
{ }; class Boss : public BaseSubject
{ }; class StockObserver : public BaseObserver
{
public :
StockObserver(string name, basesubject_t sub) : BaseObserver(name, sub)
{ } void CloseStock()
{
cout<<m_sub->m_subject_state<<m_name<<" 关闭CloseStock"<<endl;
} void Update()
{
CloseStock();
}
}; class NBAObserver : public BaseObserver
{
public :
NBAObserver(string name, basesubject_t sub): BaseObserver(name, sub)
{
} void Update()
{
CloseNBA();
} void CloseNBA()
{
cout<<m_sub->m_subject_state<<m_name<<" 关闭NBA"<<endl;
}
}; typedef shared_ptr<Boss> boss_t;
typedef shared_ptr<Secretary> secretary_t;
typedef shared_ptr<StockObserver> stockobserver_t;
typedef shared_ptr<NBAObserver> nbaobserver_t; int main(int argc, char** argv)
{
boss_t boss(new Boss());
secretary_t may(new Secretary());
stockobserver_t neo(new StockObserver("neo", may));
nbaobserver_t jason(new NBAObserver("jason", may)); may->m_subject_state = "老板回来啦! ";
may->Attach(neo);
may->Attach(jason); (*may).Notify(); /*
boss->m_subject_state = "老板回来啦! ";
boss->Attach(neo);
boss->Attach(jason);
*/
(*boss).Notify(); return ;
}

C++ 实现设计模式之观察者模式的更多相关文章

  1. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  2. 设计模式之观察者模式(Observable与Observer)

    设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...

  3. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  4. php 设计模式之观察者模式(订阅者模式)

    php 设计模式之观察者模式 实例 没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则 介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改 ...

  5. [JS设计模式]:观察者模式(即发布-订阅者模式)(4)

    简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...

  6. 实践GoF的23种设计模式:观察者模式

    摘要:当你需要监听某个状态的变更,且在状态变更时通知到监听者,用观察者模式吧. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:观察者模式>,作者: 元闰子 . 简介 现在有 ...

  7. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

  8. [python实现设计模式]-4.观察者模式-吃食啦!

    观察者模式是一个非常重要的设计模式. 我们先从一个故事引入. 工作日的每天5点左右,大燕同学都会给大家订饭. 然后7点左右,饭来了. 于是燕哥大吼一声,“饭来啦!”,5点钟定过饭的同学就会纷纷涌入餐厅 ...

  9. 【GOF23设计模式】观察者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_观察者模式.广播机制.消息订阅.网络游戏对战原理 package com.test.observer; import ja ...

  10. 设计模式学习——观察者模式(Observer Pattern)

    0. 前言 观察者模式在许多地方都能够用到,特别是作为MVC模式的一部分,在MVC中,模型(M):存放数据,视图(V):显示数据.当模型中的数据发生改变时,视图会得到通知,这是典型的观察者模式. 1. ...

随机推荐

  1. VIM 分割窗口

    VIM 分割窗口     *08.1*  分割窗口 打开新窗口最简单的命令如下: :split 这个命令把屏幕分解成两个窗口并把光标置于上面的窗口中: +----------------------- ...

  2. A+B Problem III

    描述 求A+B是否与C相等. 输入 T组测试数据. 每组数据中有三个实数A,B,C(-10000.0<=A,B<=10000.0,-20000.0<=C<=20000.0) 数 ...

  3. (转)CentOS 6.5下Redis安装详细步骤

    Redis简介:Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作 ...

  4. 到目前为止,Linux下最完整的Samba服务器配置攻略

    关 于Samba,大家有没有这种感觉,弄了N久丫的死活不喘气儿.找来各种“哥”和“姐”,发现全是“详解…配置专题”,看了半天不知道别个在说什么,好不 容易找了个简单的教程,从头到尾跟着做,尼玛,浪费时 ...

  5. pat 1006 Sign In and Sign Out (25)

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  6. akka构建简单分布式应用

    http://www.cnblogs.com/hequn/articles/3764630.html 当程序的要求达到一台计算机的极限时,我们便需要将程序分布式化,让程序运行在多台计算机上.akka提 ...

  7. 【MINA】序列化和反序列化我们要考虑的问题

    概念 序列化:将java对象转换为字节序列的过程叫做序列化 反序列化:将字节对象转换为java对象的过程叫做反序列化 要解决的问题 1.序列化时间 2.反序列化时间 3.bytes大小 4.操作方便 ...

  8. 树莓派配置AP模式

    所需硬件:树莓派.无线网卡 1.查看无线网卡是否被识别 pi@raspberrypi ~ $ sudo lsusb Bus Device : ID : Standard Microsystems Co ...

  9. Latex之CJK中文书签乱码[转]

    在使用CJK宏包编辑中文时,可以使用不同的编码方式,一种是UTF-8格式:另外一种是GBK编码.在使用GBK编码时,生成的PDF格式中的文本是GBK的编码方式,因此大部分不支持GBK编码的PDF阅读器 ...

  10. Sencha Touch id 和 itemId

    通过id获得组件: var view=Ext.getCmp('id'); 通过itemId获得组件: var view = ComponentQuery.query('view_xtype'), // ...