[toc]
观察者模式定义
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
气象站布告板设计
#include <utility>#include "algorithm"#include "iostream"#include "vector"using namespace std;class Observer {public:// 所有的观察者都必须实现update方法virtual void update(float temp, float humidity, float pressure){};};class Subject {public:virtual void registerObserver(Observer *o) {}virtual void removeObserver(Observer *o) {}virtual void notifyObserver() {} // 主题改变时调用次方法,以通知所有的观察者};class DisplayElement {virtual void display() {}};// weatherdata 需要实现Subject接口class WeatherData : public Subject {private:vector<Observer *> observers;float temperature{};float humidity{};float pressure{};public:WeatherData() = default;void registerObserver(Observer *o) override { observers.push_back(o); }void removeObserver(Observer *o) override {for (auto iter = observers.begin(); iter != observers.end(); iter++) {if (*iter == o) {observers.erase(iter, iter + 1);break;}}}void notifyObserver() override {for (auto ob : observers) {ob->update(temperature, humidity, pressure);}}void measurementsChanged(float temp,float humi,float pressure) {this->temperature=temp;this->humidity=humi;this->pressure=pressure;notifyObserver();}};class CurrentConditionDisplay : public Observer, DisplayElement {private:float temperature{};float humidity{};Subject *weatherData;public:explicit CurrentConditionDisplay(Subject *wethData) {weatherData = wethData;weatherData->registerObserver(this);}void update(float temp, float humidity, float pressure) override {this->temperature=temp;this->humidity=humidity;display();}void display() override {cout<<"Current Condition: "<<temperature<<"F "<<" and "<<humidity<<endl;}};class StatisticsDisplay : public Observer, DisplayElement {private:float temperature{};float humidity{};Subject *weatherData;public:explicit StatisticsDisplay(Subject *wethData) {weatherData = wethData;weatherData->registerObserver(this);}void update(float temp, float humidity, float pressure) override {this->temperature=temp;this->humidity=humidity;display();}void display() override {cout<<"Statics Condition: "<<temperature<<"F "<<" and "<<humidity<<endl;}};int main() {cout << ">>>>>>>>>>>>>>>>>RUNNING on CLion<<<<<<<<<<<<<" << endl;auto *weatherData=new WeatherData();auto *currentDisplay=new CurrentConditionDisplay(weatherData);auto *staticsDisplay=new StatisticsDisplay(weatherData);weatherData->measurementsChanged(80,65,30.4);weatherData->measurementsChanged(82,70,29.3);weatherData->measurementsChanged(78,90,28.3);return 0;}
