C++设计模式实现--观察者

概述

  在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。

     意图

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

 特点:

1、  Subject和Observer之间是松偶合的,分别可以各自独立改变。

2、  Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。

3、  遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

应用场景:

1、  对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。

2、  对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

        UML图

       

          代码实现

[cpp] view
plain
copy

  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
plain
copy

  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
plain
copy

  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
plain
copy

  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
plain
copy

  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
plain
copy

  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
plain
copy

  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. }

C++设计模式实现--观察者,布布扣,bubuko.com

时间: 2024-08-09 06:17:04

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

php设计模式 四 (观察者 原型模式 迭代器模式)

观察者模式 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 当一个对象的状态发生改变时,依赖他的对象全部会接到通知,并自动更新.观察者模式实现了低耦合 非入侵式的通知与更新机制. 观察者模式示例: 首先创建一个事

入门设计模式之观察者

学习更多设计模式请参考:入门设计模式之汇总篇 观察者模式:多个观察者对象同时观察一个主题对象,当这个主题对象发生变化时,会通知所有的观察者 来看一下下方类图 Subject:主题类,所有主题的父类,负责对观察者的管理,有添加观察者,删除观察者,通知所有的方法 SubjectImpl:主题子类,拥有状态属性,当状态改变时会调用父类的notifyObserver方法通知所有观察者 Observe:观察者,定义了接受主题变化通知的方法 ObserveImpl:观察者实现类,实现了update()方法用

设计模式(3)------观察者设计模式(jdk自带)

一:原理就是观察者设计模式的原理直接上图和代码 WeatherData(主题接口实现) 1 public class WeatherData extends Observable { 2 private float temperature; 3 private float humidity; 4 private float pressure; 5 6 public WeatherData() { 7 } 8 9 public void measurementsChanged() { 10 set

js 设计模式:观察者和发布订阅模式

总是把这两个当作同一个模式,但其实是不太一样的,现在重温一下. 观察者模式 观察者直接订阅目标,当目标触发事件时,通知观察者进行更新 简单实现 class Observer { constructor(name) { this.name = name; } update() { console.log(`${this.name} update`) } } class subject { constructor() { this.subs = []; } add(observer) { this.

理解设计模式(观察者)

观察者模式,保证主题和若干观察者之间的一致性. 概述 有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式 此种模式通常被用来实现事件处理系统 特定环境 一个对象改变,同时引发其他若干对象发生变化时 主动改变的对象和被动变化的对象之间相对独立,以便复用和维护 一类问题 一个系统,由一个对象和若干协作对象组成,同时要避免这些对象之间相互耦合 解决方案 抽象主题角色 具体主题角色 抽象观察者角色 具体观察者角色 抽象主题角色

设计模式 之 观察者--委托与事件

观察者模式(Observer) 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 假设有个高档的热水器,当水温超过95度的时候:一.扬声器会开始发出语音,告诉你水的温度:二.液晶屏也会改变水温的显示,以提示水已经快烧开了. 如果我们要通过程序来模拟这个烧水的过程.现在假设热水器由三部分组成:热水器.警报器.显示器,它们来自于不同厂商并进行了组装.那么,热水器应该仅负责烧水,它不能发出警报也不能显示水温

圣思园java se培训总结(78-)(swing的设计模式,观察者设计模式)

BorderLayout分东西南北中,默认是Frame的布局 FlowLayout是Panel的默认布局 GridLayout是网格布局!实例化一个网格布局对象时可以指定网格数量 panel必须添加到某个容器中才能显示! 事件是描述发生了什么的对象,这些对象是AWT提供好的,例如左键击单击会产生一个ActionEvent对象 事件源是发生这个事件的某个组件,例如单击某个按钮,这个按钮就是事件源 事件处理器 就是一个接收事件,处理事件的方法,用户自己写的! 单击一个按钮就会产生一个事件 (Acti

JAVA_SE基础——37.单例设计模式

本文继续介绍23种设计模式系列之单例模式. 我们在javaSE的基础学习中,会讲到:单例设计模式.模板设计模式.装饰者设计模式.观察者设计模式.工厂设计模式 我以后随着水平的提高,我会专门开个分类写设计模式的.现在请原谅我的知识面有限-- 设计模式→中的    "模式" 二字是什么意思.. 模式:模式就是解决 一类 问题的固定步骤 . 模式的概念最早起源于建筑行业.... 建房子的步骤都是一样子: 打地基-----> 浇柱子------->盖楼面--------->砌

单例、观察者、代理、备忘录、工厂

单例.观察者.代理.备忘录.工厂 分类: java 2014-07-03 10:13 364人阅读 评论(0) 收藏 举报 一.Singleton单例模式 Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序运行生命周期中,使用了单类模式的类只能有一个实例对象存在. 1.饱汉模式,声明时就创建实例对象 [java] view plaincopy public class Singleton1 { public static final Singleton1 instance =