C++設計模式——觀察者模式
觀察者模式:定義了對象之閒的一對多依賴,這樣一來,儅一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新。
觀察者模式的類圖:
代碼示例 :利用WeatherData對象取得數據,更新concreteobserver 並顯示出來,以下是代碼示例:
![](/assets/blank.gif)
![](/assets/blank.gif)
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
![](/assets/blank.gif)
![](/assets/blank.gif)
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
![](/assets/blank.gif)
![](/assets/blank.gif)
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
![](/assets/blank.gif)
![](/assets/blank.gif)
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
![](/assets/blank.gif)
![](/assets/blank.gif)
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++設計模式——觀察者模式相关推荐
- Java 設計模式 - 觀察者模式
Java設計模式-觀察者模式 什麼是觀察者模式? 觀察者模式的結構 代碼實現 實際案例 什麼是觀察者模式? 首先先來看看一個對於觀察者模式一個經典的描述,出自於阎宏博士的 <JAVA與模式> ...
- HeadFirst之设计模式 觀察者模式
觀察者顧名思義,就是一個觀察者,如當我們訂閱報紙,我們就是報紙的觀察者,報紙就是一個主題(Subject),我們可以訂閱報紙可以退訂報紙,而報社的一方只要有訂閱者就得時時刻刻地準備發送報紙. ...
- android觀察者模式三種實現方法
demo: EditText計算身高體重,使用觀察者模式實現 1.內部類實現 package com.zhg.day0102;import android.app.Activity; import a ...
- 設計模式之王 - MVC
Model-View-Controller (縮寫 MVC ) 是 Cocoa 框架的一部分,並且毋庸置疑是最常用的設計模式之一.它可以幫你把物件根據職責進行劃分和歸類. 作為劃分依據的三個基本職責是 ...
- C++設計模式——策略模式
模式定義:策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶. 舉個例子來説,不同鴨子的行爲是不同的,我們可以把變化的行爲提取出來進行封裝.我將鴨子的飛 ...
- Java 設計模式 - 適配器模式
Java 設計模式 - 適配器模式 適配器模式前言 模式概述 模式結構 模式具體應用 類適配器模式 對象適配器模式 優缺點 適配器模式前言 在現實生活中,經常出現兩個對象因接口不兼容而不能在一起工作的 ...
- C#適應練習:幾種常見設計模式的實現
一.單例及原型模式 單例:即使用一個固定對象的對象進行操作,實現起來很簡單 using System; using System.Collections.Generic; using System.L ...
- 設計模式之Visitor
Visitor定義 作用於某個物件群中各個物件的操作. 它可以使你在不改變這些物件本身的情況下,定義作用於這些物件的新操作. 在Java中,Visitor模式實際上是分離了collection結構中的 ...
- php interface的设计,【PHP、設計模式、大頭菜】流暢介面 Fluent Interface
September 29, 2020 2 min to read [PHP.設計模式.大頭菜]流暢介面 Fluent Interface 流暢介面 Fluent Interface 流暢介面,常用於撰 ...
最新文章
- MnasNet 测试
- ZZULIOJ 1918: G 【二分图匹配】
- DFT,DTFT,DFS,FFT区别
- 《途客圈创业记:不疯魔,不成活》一一1.6 申请助跑计划
- 31、JAVA_WEB开发基础之servlet(2)
- 计算机存储数字,计算机是如何存储数字的
- oracle util_mail,Oracle UTL_MAIL邮件包程序使用实践
- Java多线程学习十六:读写锁 ReadWriteLock 获取锁有哪些规则
- OpenShift 4 - DevSecOps Workshop (8) - 为Pipeline增加生成Image任务
- cut point and bridge总结
- asp.net怎么实现按条件查询_用这个提取函数王中王,制作数据查询表
- Ubuntu Thinkphp page not found
- 数论和有限域的基本概念
- 爆强的一句话,工作之余放松放松!
- 2022保安员(初级)考试题库及模拟考试
- 计算机软件著作权登记去哪查询,软件著作权在哪里查询
- 关闭IDEA提示 empty tag doesn't work in some browsers(设置inspections)
- 华顺信安 白帽汇安全研究院一面复盘
- 怎么检测计算机硬件损坏,笔记本硬件检测 电脑硬件损坏检测工具
- POST请求和PUT请求的区别