设计模式--观察者模式C++实现
观察者模式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++实现的更多相关文章
- 18. 星际争霸之php设计模式--观察者模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- linkin大话设计模式--观察者模式
linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- js设计模式-观察者模式
定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...
- 【设计模式】Java设计模式 - 观察者模式
[设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...
- [Head First设计模式]山西面馆中的设计模式——观察者模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...
- javascript 设计模式-----观察者模式
观察者模式在设计模式中被重点提到,因为它应用的场景非常多,而且在模块化设计当中扮演着非常重要的角色.MVC模式中最底层的就是观察者模式,当下流行的javascript框架backbone就是很好地运用 ...
- c#设计模式-观察者模式
Observer 与 Subject 互为耦合,但是这种耦合的双方都依赖于抽象,而不依赖于具体. 一.观察者模式 目的 我们都知道解决一个问题有N种解决方式,但在面向对象的设计中如何能做到“高内聚,低 ...
- JAVA 设计模式 观察者模式
用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...
- IOS设计模式-观察者模式
前言:23种软件设计模式中的观察者模式,也是在软件开发中,挺常用的一种设计模式.而在苹果开发中,苹果Cocoa框架已经给我们实现了这个设 计模式,那就是通知和KVO(Key-Value Observi ...
随机推荐
- cpu-》内存-》磁盘
cpu相当于计算机大脑负责计算以及发送执行命令:内存相当于人的记忆是临时存储:磁盘相当于笔记本,负责永久存储数据: 当系统需要调用硬盘当中的数据时,会将硬盘数据读入内存供cpu进行处理.cpu只会读取 ...
- 支持向量机SVM、优化问题、核函数
1.介绍 它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解. 2.求解过程 1.数据分类—SVM引入 ...
- SQL Server排名函数与排名开窗函数
什么是排名函数?说实话我也不甚清楚,我知道 order by 是排序用的,那么什么又是排名函数呢? 接下来看几个示例就明白了. 首先建立一个表,随便插入一些数据. ROW_NUMBER 函数:直接排序 ...
- 003-spring boot项目的项目属性配置
一.application.properties文件. 1.项目的配置文件内容.配置了端口,超时连接时间, 2.控制器. 3.访问. 二.application.yml文件 1.application ...
- XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem J. Terminal
题目:Problem J. TerminalInput file: standard inputOutput file: standard inputTime limit: 2 secondsMemo ...
- 2017 Multi-University Training Contest - Team 4 hdu6070 Dirt Ratio
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6070 题面: Dirt Ratio Time Limit: 18000/9000 MS (Ja ...
- $ 一步一步学Matlab(3)——Matlab中的数据类型
小学时候我们就知道,数学中有自然数.整数.分数.小数等等很多种类型的数.到了中学,我们又发现了其实还有无理数.复数这些有些特殊的数.到了大学学了高等数学之后,我们又知道了其实还存在着无穷大.无穷小这样 ...
- git推送到github报错:error: The requested URL returned error: 403 Forbidden while accessing https://github.com
最近使用git命令从github克隆仓库到版本,然后进行提交到github时报错如下: [root@node1 git_test]# git push origin mastererror: The ...
- git的应用
对git的应用 (终于第一次用会git) 根据胡东晖同学的博客(使用git推送代码到开源中国以及IDEA环境下使用git)与热心指导,自己跟着做了,虽然途中出了很多很多问题,但是好在最后还是成功了!! ...
- 解决java.lang.IllegalArgumentException: Can't load standard profile: LINEAR_RGB.pf
调用org.apache.batik.transcoder.Transcoder转换图片时,报了以下错误:java.lang.IllegalArgumentException: Can't load ...