设计模式->观察者模式
观察者模式能很大的降低模块之前的耦合。详细的观察者模式,客官们能够去看《设计模式》或者《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;
}
};
測试例如以下:
ConcreteSubject subject; ConcreteObserver obs1;
ConcreteObserver obs2; subject.registerObserver(&obs1);
subject.registerObserver(&obs2); for (int i=0; i<100; ++i)
{
subject.run();
}
以上的測试写在了github的test(使用gtest进行測试)里面:https://github.com/tenghui0425/Common/blob/master/experiment/test/subject_observer_test.cpp
转载请注明出处:http://blog.csdn.net/tenghui0425/article/details/24243475
设计模式->观察者模式的更多相关文章
- 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 ...
随机推荐
- Unity学习-元素类型(三)
在看下面操作时,先记住三句话 1.游戏对象 是由 组件 组成的:衣服 2.材质(Material):就是衣服的设计方案 3.纹理(Texture):做衣服的布料 从GameObject到Cube 第一 ...
- 10.Nodes and Bindings
节点数据绑定 节点是构成Ventuz场景的基本元素.每个节点既属于图层.也属于层级或内容.既可以在图层编辑器,也可以在层级编辑器或内容编辑器中编辑. 内容节点包括资产描述(如材质.xml文件等).数字 ...
- Java中 == 和 equals()
记住三句话 1. 语义上:==指的是内存引用一样.equals是指的是逻辑相等.逻辑相等具体的意思由编写者决定(即在引用类型中,"=="是比较两个引用是否指向堆内存里的同一个地址( ...
- 清瘦的记录者: 一个比dbutils更小巧、好用的的持久化工具
https://gitee.com/bitprince/memory 1. 概述 1.1 连接.语句和结果集 从JDBC的规范上看,其对数据访问层有相当简洁的抽象:1.连接(connection) 2 ...
- sql server 数据分析优化实战(一)——SQL语句优化
前言 在我们进行数据分析的时候,首要的目标是根据业务逻辑,通过编写SQL代码得到我们想要的结果,这是毋庸置疑的.一般情况下,由于我们分析的数据量比较少,体会不出SQL语句各种写法的性能优劣,对SQL代 ...
- CNN结构:色彩特征提取-从RGB空间到HSV空间(色彩冷暖判断)
转自知乎和百度百科:从零开始学后期 文章: 冷暖色区分?冷暖肤色适用于那些色系的彩妆? 文章:干货 |如何判断人体色冷暖?如何判断色彩冷暖?(值得收藏研读!) -蒜苗 ...
- 使用super实现类的继承
查看一个类继承了哪些类可以用__bases__方法查看 class People: def __init__(self,name,age,sex): self.name=name self.ag ...
- C# 获取当年的周六周日
public void GetWMDay() { List<string> list = new List<string>(); "; DateTime counYe ...
- getdlgitemtext
获取控件内信息 set 设置控件内信息 oninitdialog初始化控件时的操作
- CF17E Palisection (回文自动机+DP)
题目传送门 题目大意:给你一个字符串,让你求出有多少对相交的回文子串 啊啊啊啊降智了,我怎么又忘了正难则反! 求相交会很难搞.把问题转化成求互不相交的回文子串再减一下就行了 先利用$PAM$求出以每个 ...