觀察者模式:定義了對象之閒的一對多依賴,這樣一來,儅一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新。

觀察者模式的類圖:

代碼示例 :利用WeatherData對象取得數據,更新concreteobserver 並顯示出來,以下是代碼示例:

 1 #ifndef SUBJECT_H
 2 #define SUBJECT_H
 3 #include "observer.h"
 4 class subject
 5 {
 6 public:
 7     subject();
 8     virtual ~subject();
 9     virtual void registerObserver(Observer* o) = 0;
10     virtual void removeObserver(Observer* o)= 0;
11     virtual void notifyObservers() = 0;
12 };
13
14 #endif // SUBJECT_H

Subject

 1 #ifndef OBSERVER_H
 2 #define OBSERVER_H
 3
 4 class Observer
 5 {
 6 public:
 7     Observer();
 8     virtual ~Observer();
 9     virtual void update(float temp,float humidity,float pressure) = 0;
10
11 };
12
13 #endif // OBSERVER_H

Observer

 1 #include "weather_data.h"
 2
 3 WeatherData::WeatherData()
 4 {
 5     m_vecObserver.clear();
 6 }
 7 WeatherData::~WeatherData()
 8 {
 9
10 }
11
12 void WeatherData::registerObserver(Observer *o)
13 {
14     m_vecObserver.append(o);
15
16 }
17
18 void WeatherData::removeObserver(Observer* o)
19 {
20   int index =  m_vecObserver.indexOf(o);
21   if(index >=0)
22   {
23       m_vecObserver.remove(index);
24   }
25 }
26
27 void WeatherData::notifyObservers()
28 {
29     for(int i = 0;i < m_vecObserver.size();i++)
30     {
31         m_vecObserver.at(i)->update(this->temperature,this->humidity,this->pressure);
32     }
33 }
34
35 void WeatherData::setMeasureMents(float temperature, float humidity, float pressure)
36 {
37     this->temperature = temperature;
38     this->humidity = humidity;
39     this->pressure = pressure;
40     measurementsChanged();
41 }
42 float WeatherData::getTemperature()
43 {
44     return this->temperature;
45 }
46
47 float WeatherData::getHumidity()
48 {
49     return this->humidity;
50 }
51
52 float WeatherData::getPressure()
53 {
54     return this->pressure;
55 }
56
57 void WeatherData::measurementsChanged()
58 {
59    notifyObservers();
60 }

weather_data

 1 #include "concreteobserver.h"
 2 #include <QDebug>
 3 #include <weather_data.h>
 4 ConcreteObserver::ConcreteObserver(subject *weatherData)
 5 {
 6     this->weatherData = weatherData;
 7     weatherData->registerObserver(this);
 8
 9 }
10
11 void ConcreteObserver::update(float temp, float humidity, float pressure)
12 {
13     this->temperature = temp;
14     this->humidity = humidity;
15     display();
16 }
17
18 void ConcreteObserver::display()
19 {
20     qDebug()<<"當前溫度:"<<this->temperature<<"當前海拔:"<<this->humidity;
21 }

concreteobserver

 1 #include <QCoreApplication>
 2 #include "concreteobserver.h"
 3 #include "weather_data.h"
 4 int main(int argc, char *argv[])
 5 {
 6     QCoreApplication a(argc, argv);
 7    WeatherData* subject = new WeatherData();
 8     ConcreteObserver* observer = new ConcreteObserver(subject);
 9    subject->setMeasureMents(20,30,40);
10    subject->setMeasureMents(40,50,20);
11
12
13     return a.exec();
14 }

main

參考資料:HeadFirst 設計模式

源碼:

转载于:https://www.cnblogs.com/vegetable/p/7634665.html

C++設計模式——觀察者模式相关推荐

  1. Java 設計模式 - 觀察者模式

    Java設計模式-觀察者模式 什麼是觀察者模式? 觀察者模式的結構 代碼實現 實際案例 什麼是觀察者模式? 首先先來看看一個對於觀察者模式一個經典的描述,出自於阎宏博士的 <JAVA與模式> ...

  2. HeadFirst之设计模式 觀察者模式

    觀察者顧名思義,就是一個觀察者,如當我們訂閱報紙,我們就是報紙的觀察者,報紙就是一個主題(Subject),我們可以訂閱報紙可以退訂報紙,而報社的一方只要有訂閱者就得時時刻刻地準備發送報紙.     ...

  3. android觀察者模式三種實現方法

    demo: EditText計算身高體重,使用觀察者模式實現 1.內部類實現 package com.zhg.day0102;import android.app.Activity; import a ...

  4. 設計模式之王 - MVC

    Model-View-Controller (縮寫 MVC ) 是 Cocoa 框架的一部分,並且毋庸置疑是最常用的設計模式之一.它可以幫你把物件根據職責進行劃分和歸類. 作為劃分依據的三個基本職責是 ...

  5. C++設計模式——策略模式

    模式定義:策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶. 舉個例子來説,不同鴨子的行爲是不同的,我們可以把變化的行爲提取出來進行封裝.我將鴨子的飛 ...

  6. Java 設計模式 - 適配器模式

    Java 設計模式 - 適配器模式 適配器模式前言 模式概述 模式結構 模式具體應用 類適配器模式 對象適配器模式 優缺點 適配器模式前言 在現實生活中,經常出現兩個對象因接口不兼容而不能在一起工作的 ...

  7. C#適應練習:幾種常見設計模式的實現

    一.單例及原型模式 單例:即使用一個固定對象的對象進行操作,實現起來很簡單 using System; using System.Collections.Generic; using System.L ...

  8. 設計模式之Visitor

    Visitor定義 作用於某個物件群中各個物件的操作. 它可以使你在不改變這些物件本身的情況下,定義作用於這些物件的新操作. 在Java中,Visitor模式實際上是分離了collection結構中的 ...

  9. php interface的设计,【PHP、設計模式、大頭菜】流暢介面 Fluent Interface

    September 29, 2020 2 min to read [PHP.設計模式.大頭菜]流暢介面 Fluent Interface 流暢介面 Fluent Interface 流暢介面,常用於撰 ...

最新文章

  1. MnasNet 测试
  2. ZZULIOJ 1918: G 【二分图匹配】
  3. DFT,DTFT,DFS,FFT区别
  4. 《途客圈创业记:不疯魔,不成活》一一1.6 申请助跑计划
  5. 31、JAVA_WEB开发基础之servlet(2)
  6. 计算机存储数字,计算机是如何存储数字的
  7. oracle util_mail,Oracle UTL_MAIL邮件包程序使用实践
  8. Java多线程学习十六:读写锁 ReadWriteLock 获取锁有哪些规则
  9. OpenShift 4 - DevSecOps Workshop (8) - 为Pipeline增加生成Image任务
  10. cut point and bridge总结
  11. asp.net怎么实现按条件查询_用这个提取函数王中王,制作数据查询表
  12. Ubuntu Thinkphp page not found
  13. 数论和有限域的基本概念
  14. 爆强的一句话,工作之余放松放松!
  15. 2022保安员(初级)考试题库及模拟考试
  16. 计算机软件著作权登记去哪查询,软件著作权在哪里查询
  17. 关闭IDEA提示 empty tag doesn't work in some browsers(设置inspections)
  18. 华顺信安 白帽汇安全研究院一面复盘
  19. 怎么检测计算机硬件损坏,笔记本硬件检测 电脑硬件损坏检测工具
  20. POST请求和PUT请求的区别

热门文章

  1. DNFSF怎么选服务器? 选什么样的服务器?
  2. AXI interconnect IP核的说明及用法
  3. STC15W104 8脚单片机串口下载程序
  4. LinuxCNC性能剖析
  5. 27岁才开始学习编程靠谱吗?40岁都不晚
  6. js 正则转换千分位(带小数)
  7. android RecyclerView列表自动播放实现
  8. 仿生蠕虫机器人制作步骤_另类的变形金刚:3D打印仿生蠕虫机器人
  9. 3D建模是什么?0基础小白如何挑战年薪30W+
  10. JAVA面试题--Docker(最新最全)