C++设计模式--观察员
概要
在软件构建过程中。我们须要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,全部的依赖对象(观察者对象)都将得到通知。假设这种依赖关系过于紧密,将使软件不能非常好地抵御变化。使用面向对象技术。能够将这种依赖关系弱化,并形成一种稳定的依赖关系。
从而实现软件体系结构的松耦合。
意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 全部依赖于它的对象都得到通知并被自己主动更新。[GOF 《设计模式》]
特点:
1、 Subject和Observer之间是松偶合的,分别能够各自独立改变。
2、 Subject在发送广播通知的时候,无须指定详细的Observer。Observer能够自己决定是否要订阅Subject的通知。
3、 遵守大部分GRASP原则和经常使用设计原则,高内聚、低偶合。
应用场景:
1、 对一个对象状态的更新,须要其它对象同步更新,并且其它对象的数量动态可变。
2、 对象仅须要将自己的更新通知给其它对象而不须要知道其它对象的细节。
UML图
代码实现
- #pragma once
- #include <string>
- #include <list>
- #include "Define.h"
- class IObserver;
- class ISubject
- {
- public:
- ISubject(void);
- virtual ~ISubject(void);
- virtual int Attach(IObserver* pObs) = 0;
- virtual int Detach(IObserver* pObs) = 0;
- virtual int Notify() = 0;
- virtual State GetState() = 0;
- virtual void SetState(const State& state) = 0;
- protected:
- typedef std::list<IObserver*> L_OBS;
- L_OBS m_obsArray;
- };
- #pragma once
- #include "ISubject.h"
- class CSubjectA : public ISubject
- {
- public:
- CSubjectA(void);
- virtual ~CSubjectA(void);
- virtual int Attach(IObserver* pObs);
- virtual int Detach(IObserver* pObs);
- virtual int Notify();
- virtual State GetState();
- virtual void SetState(const State& state);
- private:
- State m_state;
- };
- #include "CSubjectA.h"
- #include "IObserver.h"
- CSubjectA::CSubjectA(void)
- {
- }
- CSubjectA::~CSubjectA(void)
- {
- if (!m_obsArray.empty())
- {
- m_obsArray.clear();
- L_OBS().swap(m_obsArray);
- }
- }
- int CSubjectA::Attach( IObserver* pObs )
- {
- m_obsArray.push_back(pObs);
- return 0;
- }
- int CSubjectA::Detach( IObserver* pObs )
- {
- m_obsArray.remove(pObs);
- return 0;
- }
- int CSubjectA::Notify()
- {
- L_OBS::iterator it_beg, it_end=m_obsArray.end();
- for (it_beg=m_obsArray.begin(); it_beg!=it_end; ++it_beg)
- {
- (*it_beg)->Update();
- }
- return 0;
- }
- State CSubjectA::GetState()
- {
- return m_state;
- }
- void CSubjectA::SetState( const State& state )
- {
- m_state = state;
- }
- #pragma once
- #include "Define.h"
- class IObserver
- {
- public:
- IObserver(void);
- virtual ~IObserver(void);
- virtual int Update() = 0;
- };
- #pragma once
- #include "IObserver.h"
- class ISubject;
- class CObserveA : public IObserver
- {
- public:
- CObserveA(ISubject* pSubject);
- virtual ~CObserveA(void);
- virtual int Update();
- private:
- ISubject* m_pSubject;
- };
- #include "CObserveA.h"
- #include <cstdio>
- #include "ISubject.h"
- CObserveA::CObserveA(ISubject* pSubject)
- :m_pSubject(pSubject)
- {
- m_pSubject->Attach(this);
- }
- CObserveA::~CObserveA(void)
- {
- m_pSubject->Detach(this);
- }
- int CObserveA::Update()
- {
- State str = m_pSubject->GetState();
- printf("first get: [%s]\n", str.c_str());
- return 0;
- }
- #include "CSubjectA.h"
- #include "CObserveA.h"
- int main()
- {
- CSubjectA subA;
- CObserveA first(&subA);
- subA.SetState("test set state");
- subA.Notify();
- return 0;
- }
版权声明:本文博客原创文章。博客,未经同意,不得转载。
C++设计模式--观察员的更多相关文章
- iOS中MVC等设计模式详解
iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...
- Cocos观察者设计模式和通报机制
观察员(Observer)模式也称为公告/订阅(Publish/Subscribe)模式.这是 MVC( 模型-视图-控制器)模型的重要组成部分.天气一直讨论的英国最喜欢的话题,近期天气变化几年已成为 ...
- 北京设计模式学习组bjdp.org第7次活动(2013.08.04)回顾会纪要
时间:2013.08.04,9am-7pm 地点:北京龙泉寺(北京凤凰岭风景区内) 参加人数:北京龙泉寺信息中心(20人).北京设计模式学习组(9人) 活动要点: 1)寺院巡礼:义工师兄带领参观寺院. ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
随机推荐
- 【thinking in java】读书笔记(一)
近期開始读tij,好记性不如烂笔头,所以还是记录一下,方便以后查阅. 一.各种初始化问题: 方法重载的问题: 方法的重载,差别是靠传入方法的參数,而不是返回值.比方f(),假设是返回值的话,easy产 ...
- boost::asio设置同步连接超时
boost::asio设置同步连接超时 CSDN上求助无果,只好用自创的非主流方法了.asio自带的例子里是用deadline_timer的async_wait方法来实现超时的,这种方法需要单独写 ...
- XML学习经验实例总结2
DTD约束 Book.dtd: <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,价格,介绍)> <!ELEMENT 书名 (#PCDATA)> ...
- (step6.3.3)hdu 1150(Machine Schedule——二分图的最小点覆盖数)
题目大意:第一行输入3个整数n,m,k.分别表示女生数(A机器数),男生数(B机器数),以及它们之间可能的组合(任务数). 在接下来的k行中,每行有3个整数c,a,b.表示任务c可以有机器A的a状态或 ...
- C2B未来:大数据定制
昨天看到微信SuperSofter写了一篇文章,有感而发.以便备记. 这是一种典型的C2B模式.阿里不仅仅是在与腾讯拼移动.它的电商本土业务也在稳步推进.近期一个里程碑事件是.阿里包下了美的.九阳.苏 ...
- oracle列合并
在很多场合,我们会须要用到oracle列合并,oracle提供了一些方法用于把某列的多行数据合并成一行. 一.10G曾经使用WMSYS.WM_CONCAT wmsys.wm_concat将字段的值 ...
- Delphi 实现无窗口移动(详细使用WM_NCHITTEST和PtInRect API进行测试)
procedure imgListMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) ...
- [置顶] 简单解析linux下进程通信方法
linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...
- Swift - 给表格添加编辑功能(删除,插入)
1,下面的样例是给表格UITableView添加编辑功能: (1)给表格添加长按功能,长按后表格进入编辑状态 (2)在编辑状态下,第一个分组处于删除状态,第二个分组处于插入状态 (3)点击删除图标,删 ...
- linux下用tar命令将当前目录下文件按子目录压缩归档
作者:iamlaosong 日常工作中,我们常常需要用tar命令将历史文件压缩归档,再删除源文件,以便节省空间.如果压缩归档成一个文件,就比较简单,用一条命令即可,如命令:tar -czf bak20 ...