观察者模式C++实现

1定义

Observer/Publish/subscribe发布订阅模式

定义对象间一种一对多的依赖关系,使得当一个对象改变状态时,所有依赖他的对象都能获得通知并被自动更新

2类图

角色分析

Subject被观察者,定义被观察者必须实现的职责,必须能动态增加,取消观察者。管理观察者并通知观察者

Observer观察者,接收消息后,即进行Update 。对接收到的信息进行处理

ConcreteSubject具体被观察者,定义自己业务,同时定义对那些时间进行通知

ConcreteObserver具体观察者,每个观察者都应当有自己具体的处理逻辑

3实现

class Subject

{

protected:

  Subject();

public:

  virtual ~Subject()=0;

  void add(Observer x)

  {_obv.push_back(x);}

  void del(Observer x)

  {_obv.remove(x);}

  //通知所有观察者

  void notifyObservers()

  {

    for(int i = 0; i< _obv.size();++i)

    {

      _obv[i].update();  

    }

  }

private:

  vector<Observer> _obv;//保存所有观察本对象的观察者

};

class ConcreteSubject:public Subject

{

public:

  void doSomething()

  {

    //doSomething;

    notifyObservers();

  }

};

class Observer

{

protected:

  Observer();

public:

  virtual ~Objserver()=0;

  virtual void update()=0;

};

class ConcreteObserver:public Observer

{

public:

  ConcreteObserver();

  ~ConcreteObserver();

  void update()

  {

    cout << "接受小心,并进行处理"<<endl;

  }

};

class Client
{

public:

  void operator()()

  {

    Subject* sub = new ConcreteSubject();

    Observer *obs = new ConcreteObserver();

    sub->add(obs);

    sub->doSomething();  

  }

};

4应用

优点

观察者和被观察者之间的抽象耦合

建立一套触发机制,链式运动,类似责任链

缺点

多级触发影响效率,且会有一层中断而影响整体的问题存在。应当异步处理

5使用场景

关联行为场景

时间多级触发

跨系统的消息交换场景,eg消息队列的处理机制

6注意事项

也就是缺点了:

广播链问题,  所以->最多出现一个对象既是观察者又是被观察者/最多传递两次

异步处理问题,因为可能多个观察者同时观察一个对象,∴ 异步,∵异步,∴线程安全和队列问题。参考Message Queue

7扩展

①将被观察者对于观察者的注册工作替换为  观察者检查被观察者状态的变更。做到单一职责,观察者将被观察者作为参数

②真实项目中的观察者和被观察者

a存在消息沟通

b观察者响应方式:多线程技术(异步架构)/缓存技术(同步架构)

c被观察者尽量自己做主,对于被观察者行为,自己进行确定该是否需要上报观察者

8常见距离

文件系统,文件变更-报告容量。

猫和老鼠

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

  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. php about session store db or cache

    PHP关于Session的配置: 在php.ini中配置为:session.name = PHPSESSID 在请求开始的时候,会话名称会被重置并存储到session.name配置项. 所以要想在不改 ...

  2. 百度NLP三面

    首先,面试官根据项目经验进行提问,主要是自然语言处理相关的问题:然后写代码题,字符串处理和数字运算居多:再者是一些语言基础知识,百度用的linux平台,C++和python居多.下面列出我面试中的一些 ...

  3. Dom与Bom,增删改查

    对Web标准的理解:web标准是由一系列标准组合而成的,页面有三个部分组成:结构,表现和行为.因而web标准即由结构化标准语言主要有 xml和xhtml,表现标准语言css,行为标准主要包括对象模型( ...

  4. [HZNUOJ] 使用Excel + Word 批量制作准考证

    一般程序设计考试或者ACM比赛都会使用临时账号登录,这时候就需要批量制作密码条 首先需要用Excel 存储队伍的信息 比如像这样分门别类的放好 然后在word 中制作好密码条样式 选择邮件->开 ...

  5. 虚拟机Linux系统忘记密码的情况下,修改root或其他用户密码

    使用场景 linux管理员忘记root密码,需要进行找回操作. 注意事项:本文基于centos7环境进行操作,由于centos的版本是有差异的,继续之前请确定好版本. 步骤 一.重启系统,在开机过程中 ...

  6. java中的重量级与轻量级概念

    首先轻量级与重量级是一个相对的概念,主要是对应用框架使用方便性和所提供服务特性等方面做比较的. 比方说EJB就是一个重量级的框架,因为它对所编写的代码有限制,同时它也提供分布式等复杂的功能. 相比之下 ...

  7. 【转】安装Vue.js的方法

    安装vue.js的方法   一.简介 Vue.js 是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量 ...

  8. 激活webstorm(作为一个伪前端,偶尔用用)

    推荐博客:https://blog.csdn.net/voke_/article/details/76418116 我试的方法一.

  9. xxxx interview问题解读与总结

    1. 要使线程从running到waiting状态,我们需要做些什么? 线程的状态及转换. 关联技术:http://www.cnblogs.com/kisf/p/6952524.html 2. spr ...

  10. 学号20145303 《Java程序设计》第一周学习总结

    学号20145303 <Java程序设计>第一周学习总结 教材学习内容总结 *dos命令行: dir:列出当前目录下的文件及文件名 md:创建目录 rd:删除目录.为空时文件夹(文件夹为空 ...