首页 > 代码库 > 【C++实现】HeadFirst设计模式之观察者模式
【C++实现】HeadFirst设计模式之观察者模式
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
一方可称为主题(subject),另一方可称为观察者(observer),一个主题可拥有多个观察者。当主题的数据有变动时,就会通知所有订阅了它的观察者。在这之后的操作有两种:
- 推:主题直接将数据推送给所有观察者。
- 拉:主题通知了所有观察者后,每个观察者再根据自己的需要从主题拉取所需数据。
下面是我用C++实现的代码,其中的update方法采用了“拉”的方式从主题获取数据。
//MyObserver.h #ifndef MYOBSERVER_H_INCLUDED #define MYOBSERVER_H_INCLUDED #endif // MYOBSERVER_H_INCLUDED #include<iostream> #include<vector> #define TRUE 1; #define FALSE 0; using namespace std; class MyObserver{ public: virtual void update(){ cout<<"I'm update method ofbase class.\n"; } virtual void display(){ cout<<"I'm display method ofbase class.\n"; } }; class MyObservable{ protected: vector<MyObserver*>observers; public: //MyObservable(); ~MyObservable(){ observers.clear(); } int addObserver(MyObserver& obs){ observers.push_back(&obs); return TRUE; } int deleteObserver(MyObserver& obs){ for(vector<MyObserver*>::iterator it = observers.begin();it != observers.end();++it){ if((*it) == &obs){ observers.erase(it); return TRUE; } } return FALSE; } int notifyObservers(){ for(vector<MyObserver*>::iterator it = observers.begin();it != observers.end();++it){ (*it)->update(); } return TRUE; } };
//main.cpp #include <iostream> #include "MyObserver.h" using namespace std; class WeatherData:public MyObservable{ private: float temperature; float humidity; float pressure; public: void setMeasurements(float temperature,float humidity,float pressure){ this->temperature=temperature; this->humidity=humidity; this->pressure=pressure; measurementsChanged(); } void measurementsChanged(){ notifyObservers(); } float getTemperature(){ return temperature; } float getHumidity(){ return humidity; } float getPressure(){ return pressure; } }; class CurrentDisplay:public MyObserver{ private: WeatherData* weatherData; float temperature; float humidity; float pressure; public: CurrentDisplay(WeatherData& weatherData){ this->weatherData=http://www.mamicode.com/&weatherData;>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。