设计模式C++实现——观察者模式
来源:互联网 发布:保持数据库数据一致性 编辑:程序博客网 时间:2024/06/06 00:47
模式定义
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
模式结构:
举例:
气象系统有三个部分分别是气象站(获取实际气象数据的物理装置),WeatherData对象(用来追踪来自气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看)。WeatherData对象知道如何根物理气象站联系,以取得更新信息。WeatherData对象会随机更新三个布告板的显示:目前状况(温度,湿度,气压)、气象统计和天气预报。我们的工作是建立一个 应用,利用WeatherData对象取得数据,并更新三个布告板:目前状况、气象统计和天气预报。
设计UML:
代码实现及执行结果:
#include <iostream>#include <list>using namespace std;//以下是观察者和主题的基类,其中DisplayElement是一个抽象类,用来//使子类实现显示功能classObserver{public: virtual ~Observer(){}; virtual void update(float temp, floathumidity, float pressure){};}; classDisplayElement{public: virtual ~DisplayElement(){}; virtual voiddisplay() = 0;}; classSubject{public: virtual ~Subject(){}; virtual voidregsiterObserver(Observer* o){} ; virtual voidremoveObserver(Observer* o){}; virtual voidnotifyObserver(){};}; //以下是WeatherData类,实现了注册,删除和通知观察者的功能。classWeatherData : public Subject{public: void regsiterObserver(Observer* o) { observers.push_back(o); } void removeObserver(Observer* o) { observers.remove(o); } void notifyObservers() { list<Observer*>::iteratoriter = observers.begin(); for(; iter != observers.end(); ++iter) { Observer*observer = *iter; observer->update(tempreature,humidity, pressure); } } void measurementsChanged() { notifyObservers(); } void setMeasurements(floattemp, float humid, floatpres) { tempreature= temp; humidity= humid; pressure= pres; measurementsChanged(); } private: list<Observer*>observers; float tempreature; float humidity; float pressure;};//以下是CurrentConditionsDisplay布告板的实现,主要功能为申请注册,实时更新和显示。classCurrentConditionsDisplay : public Observer, public DisplayElement{public: CurrentConditionsDisplay(Subject*weather_Data) { weatherData= weather_Data; weatherData->regsiterObserver(this); } void update(floattemp, float humid, floatpres) { tempreature= temp; humidity= humid; display(); } void display() { cout<< "Current conditions: "<< tempreature <<"F degree and " << humidity<< "% humidity" <<endl; } private: float tempreature; float humidity; Subject*weatherData;};//客户代码intmain(){ WeatherData*weatherData = new WeatherData(); CurrentConditionsDisplay*currentConditionsDisplay = new CurrentConditionsDisplay(weatherData); weatherData->setMeasurements(80,65, 30.4f); weatherData->setMeasurements(82,70, 29.2f); weatherData->setMeasurements(78,90, 29.2f); return 0;}
执行结果:
Current conditions: 80F degree and 65% humidity
Current conditions: 82F degree and 70% humidity
Current conditions: 78F degree and 90% humidity
请按任意键继续.. .
如果还要实现StatisticsDisplay和forecastDisplay或者第三方布告板,只要创建相应类,并且完成祖册即可。
设计原则
设计原则4.为了交互对象之间的松耦合设计而努力。如本例中任何时候我们可以增加新的观察者,因为主题唯一依赖的东西是一个实现Observer接口的对象列表,所以我们可以随时增加观察者。有新类型出现时,主题代码无需改变。只要在新类里实现观察者接口,然后注册为观察者即可。
设计原则1(http://blog.csdn.net/walkerkalr/article/details/28422609)的应用:在观察者模式,会改变的是主题的状态,以及观察者的数目和类型。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。
设计原则2的应用:主题和观察者都使用接口。观察者利用主题的接口向主题注册。而主题利用观察者接口通知观察者。这样可以让两者之间运作正常,又同时具有松耦合的优点。
设计原则3的应用:观察者模式利用“组合”将许多观察者组合进主题中。对象之间的这种关系不是通过集成产生的,而是在运行时利用组合的方式产生的。
参考:Head First设计模式
- 设计模式实现——观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者
- 设计模式——观察者模式(C++)
- AspectJ实现设计模式(一)——观察者模式
- 设计模式C++实现(15)——观察者模式
- 设计模式C++实现(15)——观察者模式
- 设计模式C++实现(15)——观察者模式
- 设计模式C++实现(15)——观察者模式
- 设计模式C++实现(15)——观察者模式
- [Python]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程
- PHP解析Excel文件
- 今天新路口面试的题目
- extern关键字总结
- BeanUtils工具包下载及应用
- 设计模式C++实现——观察者模式
- 未能找到元数据文件
- UNIX-高级I/O---记录锁
- 【详解】如何编写Linux下Nand Flash驱动
- Android屏幕解锁图案破解
- alter system flush shared_pool;
- 数据结构 线性表之顺序存储
- linux date日期输出格式
- [linux内存]系统启动过程中的内存管理