观察者模式能非常大的减少模块之前的耦合。具体的观察者模式,客官们可以去看《设计模式》或者《Head first设计模式》等之类的书。

在java中,java.util库中封装了观察者模式。在C++中并没有这玩意。以下就是为了封装一个C++的观察者模式而写。

观察者模式中,对于主题(subject)和观察者(observer)的接口可以是抽象出来的,而这些接口差不多都是通用的,然后要用时只要去继承这些接口,完成相应的处理即可。java中的实现也是一样的道理。

观察者,很明显是要去观察一样东西。但是,对于不同的具体实现,要观
察的东西并不同啊!比如要实现一个天气预报的,我要观察温度、湿度等。要实现一个消息的显示程序,那么我要观察的就是消息了。对于不同的实现,有些要观察
的不只一个变量,有的只有一个变量。在C++中,可以使用变长的参数表,但是,这样的实现会带来很多问题,比如类型安全等。还有什么办法可以处理不定个变
量呢?目前,我能想到的就只有用类、结构体去封装了。那么要适应不同的类呢?那就要用到模板了。

以下是初步的实现。

subject类的设计如下:

template <typename TContent>
class Subject
{
public:
    typedef TContent Content;     ///< 观察的内容类型
    typedef Observer<Content> AbstractObserver;     ///< 观察者的抽象类型

void registerObserver(AbstractObserver *obs);

void unregisterObserver(AbstractObserver *obs);

void notifyObservers(TContent cnt);
private:
    typedef std::list<AbstractObserver*> ObserverList;
    typedef typename ObserverList::iterator ObserverListIterator;
    ObserverList _observers;

};

这里将要观察的内容设为TContent,如果要观察多个值的对象,可以封装一个struct,然后做为模板参数传进来。

observer类的设计如下:

template <typename TContent>
class Observer
{
public:
    typedef TContent Content;

/**
     * @brief update 当有新内容时会被调用
     *
     * 子类化此类,重写这个函数
     * @param cnt 将的内容通过这个参数传入
     */
    virtual void update(TContent cnt) = 0;

private:
};

具体的实现代码,可以参见我的github。

这样封装后,就可以很方便使用了。以下是我使用的一个例子。

class ConcreteSubject : public Subject<int>
{
public:
    ConcreteSubject() : times(0)
    {

}

void run()
    {
        this->notifyObservers(times);
        ++times;
    }

private:
    int times;
};

class ConcreteObserver : public Observer<int>
{
public:
    virtual void update(int cnt)
    {
        cout << cnt << endl;
    }
};

丫丫吧,好店大全,畅销产品推荐 http://www.yayaba.cn

设计模式->观察者模式的更多相关文章

  1. 18. 星际争霸之php设计模式--观察者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

  3. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  4. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  5. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...

  6. [Head First设计模式]山西面馆中的设计模式——观察者模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...

  7. javascript 设计模式-----观察者模式

    观察者模式在设计模式中被重点提到,因为它应用的场景非常多,而且在模块化设计当中扮演着非常重要的角色.MVC模式中最底层的就是观察者模式,当下流行的javascript框架backbone就是很好地运用 ...

  8. c#设计模式-观察者模式

    Observer 与 Subject 互为耦合,但是这种耦合的双方都依赖于抽象,而不依赖于具体. 一.观察者模式 目的 我们都知道解决一个问题有N种解决方式,但在面向对象的设计中如何能做到“高内聚,低 ...

  9. JAVA 设计模式 观察者模式

    用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...

  10. IOS设计模式-观察者模式

    前言:23种软件设计模式中的观察者模式,也是在软件开发中,挺常用的一种设计模式.而在苹果开发中,苹果Cocoa框架已经给我们实现了这个设 计模式,那就是通知和KVO(Key-Value Observi ...

随机推荐

  1. Java内各种进制的表示

    不同进制的数据表现: 二进制:由0,1组成.以0b开头. 八进制:由0,1,...7组成.以0开头. 十进制:由0,1,...9组成.默认整数是十进制. 十六进制:由0,1,...9,a,b,c,d, ...

  2. mysql——第一次学习记的笔记

  3. MongoDB-JAVA-Driver 3.2版本常用代码全整理(3) - 聚合

    MongoDB的3.x版本Java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别.例如用Document替换BasicDBObject.通过Builders类构建Bson替代直接输入$命令等 ...

  4. ngx.lua中遇到的小问题

    作者: 胡 志伟 分类: ngx_lua, 开发代码 发布时间: 2013-09-26 08:40 ė 6评论关闭 在使用ngx.redirect 到一个新的地址时,错误日志提示: lua entry ...

  5. socket编程相关的结构体和字节序转换、IP、PORT转换函数

    注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...

  6. iOS相关思考题

    1.iOS如何应对APP版本升级,数据结构随之变化? 一般程序app升级时,数据库有可能发生改变,如增加表字段,增加表等. 此时有两种操作: 1 就是毫无留情的把本地旧数据库直接删掉,重新建立新的数据 ...

  7. 解决Ubuntu下 Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR)

    Ubuntu下CMake 编译时出现问题:Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR) 查找发现  # sudo apt-g ...

  8. windows 系统下 Firefox hostadmin插件无法修改Host

    firefox hostAdmin插件无法修改Host了,提示“ write hosts file failed check permissions”,肯定是权限出现了问题??? 使用管理员权限打开c ...

  9. POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆

    考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...

  10. dojo 加载Json数据

    1.今天研究了dojo datagrid加载WebService后台传上来的数据.研究来研究去发现他不是很难.用谷歌多调试一下就好了. 2.看很多例子,这个例子能够更好的帮我解决问题:https:// ...