概要

  在软件构建过程中。我们须要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,全部的依赖对象(观察者对象)都将得到通知。假设这种依赖关系过于紧密,将使软件不能非常好地抵御变化。使用面向对象技术。能够将这种依赖关系弱化,并形成一种稳定的依赖关系。

从而实现软件体系结构的松耦合。

     意图

  定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 全部依赖于它的对象都得到通知并被自己主动更新。[GOF 《设计模式》]

 特点:
        1、  Subject和Observer之间是松偶合的,分别能够各自独立改变。

2、  Subject在发送广播通知的时候,无须指定详细的Observer。Observer能够自己决定是否要订阅Subject的通知。
        3、  遵守大部分GRASP原则和经常使用设计原则,高内聚、低偶合。

应用场景:
        1、  对一个对象状态的更新,须要其它对象同步更新,并且其它对象的数量动态可变。
        2、  对象仅须要将自己的更新通知给其它对象而不须要知道其它对象的细节。

        UML图

       

          代码实现

[cpp] view plaincopy
  1. #pragma once
  2. #include <string>
  3. #include <list>
  4. #include "Define.h"
  5. class IObserver;
  6. class ISubject
  7. {
  8. public:
  9. ISubject(void);
  10. virtual ~ISubject(void);
  11. virtual int Attach(IObserver* pObs) = 0;
  12. virtual int Detach(IObserver* pObs) = 0;
  13. virtual int Notify() = 0;
  14. virtual State GetState() = 0;
  15. virtual void SetState(const State& state) = 0;
  16. protected:
  17. typedef std::list<IObserver*> L_OBS;
  18. L_OBS   m_obsArray;
  19. };
[cpp] view plaincopy
  1. #pragma once
  2. #include "ISubject.h"
  3. class CSubjectA : public ISubject
  4. {
  5. public:
  6. CSubjectA(void);
  7. virtual ~CSubjectA(void);
  8. virtual int Attach(IObserver* pObs);
  9. virtual int Detach(IObserver* pObs);
  10. virtual int Notify();
  11. virtual State GetState();
  12. virtual void SetState(const State& state);
  13. private:
  14. State m_state;
  15. };
[cpp] view plaincopy
  1. #include "CSubjectA.h"
  2. #include "IObserver.h"
  3. CSubjectA::CSubjectA(void)
  4. {
  5. }
  6. CSubjectA::~CSubjectA(void)
  7. {
  8. if (!m_obsArray.empty())
  9. {
  10. m_obsArray.clear();
  11. L_OBS().swap(m_obsArray);
  12. }
  13. }
  14. int CSubjectA::Attach( IObserver* pObs )
  15. {
  16. m_obsArray.push_back(pObs);
  17. return 0;
  18. }
  19. int CSubjectA::Detach( IObserver* pObs )
  20. {
  21. m_obsArray.remove(pObs);
  22. return 0;
  23. }
  24. int CSubjectA::Notify()
  25. {
  26. L_OBS::iterator it_beg, it_end=m_obsArray.end();
  27. for (it_beg=m_obsArray.begin(); it_beg!=it_end; ++it_beg)
  28. {
  29. (*it_beg)->Update();
  30. }
  31. return 0;
  32. }
  33. State CSubjectA::GetState()
  34. {
  35. return m_state;
  36. }
  37. void CSubjectA::SetState( const State& state )
  38. {
  39. m_state = state;
  40. }
[cpp] view plaincopy
  1. #pragma once
  2. #include "Define.h"
  3. class IObserver
  4. {
  5. public:
  6. IObserver(void);
  7. virtual ~IObserver(void);
  8. virtual int Update() = 0;
  9. };
[cpp] view plaincopy
  1. #pragma once
  2. #include "IObserver.h"
  3. class ISubject;
  4. class CObserveA : public IObserver
  5. {
  6. public:
  7. CObserveA(ISubject* pSubject);
  8. virtual ~CObserveA(void);
  9. virtual int Update();
  10. private:
  11. ISubject* m_pSubject;
  12. };
[cpp] view plaincopy
  1. #include "CObserveA.h"
  2. #include <cstdio>
  3. #include "ISubject.h"
  4. CObserveA::CObserveA(ISubject* pSubject)
  5. :m_pSubject(pSubject)
  6. {
  7. m_pSubject->Attach(this);
  8. }
  9. CObserveA::~CObserveA(void)
  10. {
  11. m_pSubject->Detach(this);
  12. }
  13. int CObserveA::Update()
  14. {
  15. State str = m_pSubject->GetState();
  16. printf("first get: [%s]\n", str.c_str());
  17. return 0;
  18. }
[cpp] view plaincopy
  1. #include "CSubjectA.h"
  2. #include "CObserveA.h"
  3. int main()
  4. {
  5. CSubjectA subA;
  6. CObserveA first(&subA);
  7. subA.SetState("test set state");
  8. subA.Notify();
  9. return 0;
  10. }

版权声明:本文博客原创文章。博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/hrhguanli/p/4640484.html

C++设计模式--观察员相关推荐

  1. 第6章:可维护性软件构建方法 6.2可维护性设计模式

    大纲 创造性模式 工厂方法模式创建对象而不指定要创建的确切类. 抽象工厂模式将具有共同主题的对象工厂分组. Builder模式通过分离构造和表示来构造复杂的对象. 结构模式 Bridge将抽象从其实现 ...

  2. Spring框架中的设计模式(三)

    原型模式 这篇文章的第一个设计模式是原型.可以通过官方文档查找有关Spring作用域中的bean作用域的文章中介绍了类似的概念(prototype).原型设计模式与有用相同名称的(prototype) ...

  3. jdk中的设计模式_JDK中的设计模式

    jdk中的设计模式 Zen的JCG合作伙伴Brian Du Preez 是IT领域的合作伙伴, 在收集JDK中最常见的设计模式方面做得非常出色. 模式列表的确令人印象深刻且很长,因此让我们不再ba不休 ...

  4. iOS中MVC等设计模式详解

    iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...

  5. JS设计模式 - 观察者模式与发布/订阅模式

    观察者模式本质上是一种对象行为模式,而 发布/订阅模式本质上是一种架构模式,强调组件的作用. 1. 观察者模式 观察者模式是一种设计模式,其中一个对象(称为主体)根据对象(观察者)维护一个对象列表,自 ...

  6. 【Design pattern】设计模式思路总结(一)

    看了一周的设计模式,跟着小菜的思路走! 从简单工厂过渡策略,后面看的这几个模式都是在单一职责,开放--封闭原则,依赖倒转原则下不断的改进,采用模式写出的代码更容易扩展,维护! 比较容易懂. 装饰模式: ...

  7. GOF23设计模式(结构型模式)代理模式~

    代理模式应用场景十分广泛,随便一个框架都会用到,因此学好代理模式对后续框架学习是最基本的要素!!今天我们就来讲讲代理模式! 目录 1.简介 1. 核心作用 2. 角色分析 2. 应用场景 4. 分类 ...

  8. GOF23设计模式(创建型模式)工厂模式

    目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...

  9. GOF23设计模式(创建型模式)单例模式

    目录: 一:单例模式的核心作用.常见应用场景 二:五种单例模式及其实现 三:关于反射和反序列化破解单例模式的漏洞,以及相应的解决方案 四:测试五种单例模式的效率 一:核心作用及常见应用场景: 核心作用 ...

最新文章

  1. 在家办公效率最高的组合!
  2. 动态规划 背包九讲的实现。
  3. C/C++中static的用法全局变量与局部变量
  4. STM32串口寄存器操作(转)
  5. shell 获取MD5值
  6. CloudIDE插件在手,按时下班不愁
  7. 扫雷计算机教案,《扫雷游戏》教学设计
  8. 集群环境下_Docker环境下秒建Redis集群,连SpringBoot也整上了!
  9. 【已解决】Windows Ink中没有便签怎么办
  10. C#/winform 腾讯QQ注册
  11. 代码中(C#)支持动态拼接SQL的参数化查询
  12. java将学生的成绩按不同的分数段_Java练习题
  13. 关于代理服务器的原理及用法
  14. Wireshark-ICMP数据报分析
  15. lol走砍e源码_【精选】某LOL走砍E盾+VMP卡登陆解决办法
  16. 如何从根本上防止服务器被攻击
  17. 浏览器调取摄像头人脸抓拍实现
  18. 2021csgo网页开箱网站有哪些?csgo靠谱的开箱网站大全
  19. hello,这里是cathy的技术blog~
  20. VA液晶屏底色发白是什么原因?

热门文章

  1. 利用组策略管理器映射网络驱动器的方法
  2. 大王——有趣干货集合
  3. Java 线程详解(一)线程的基础
  4. 〖Android〗屏幕触屏事件录制与回放
  5. SQL-92标准 中文翻译——定义、记号和约定 (记号)
  6. mysql 查询排序位置_MySQL-基础查询与排序
  7. 安装python扩展库时只能使用pip_使用pip安装Python扩展库的方法
  8. svn服务器会用到哪些端口_“模切压痕”会用到哪些材料?
  9. 一键开启微信“开关头像”,快试试!
  10. Google:2-1 tfkeras简介