做快餐 承包食堂的公司网站,手机模块网站,前端开发35岁以后干什么,电子请柬制作软件app设计模式最大的作用就是在变化和稳定中间寻找隔离点#xff0c;然后分离它们#xff0c;从而管理变化。将变化像小兔子一样关到笼子里#xff0c;让它在笼子里随便跳#xff0c;而不至于跳出来把你整个房间给污染掉。 设计思想
主题对象#xff08;出版者#xff09;管理… 设计模式最大的作用就是在变化和稳定中间寻找隔离点然后分离它们从而管理变化。将变化像小兔子一样关到笼子里让它在笼子里随便跳而不至于跳出来把你整个房间给污染掉。 设计思想
主题对象出版者管理某些数据当主题内的数据改变就会通知观察者订阅者。
观察者模式定义了对象之间的一对多依赖当一个对象改变状态时它的所有依赖者都会收到通知并自动更新。相比让多个对象控制同一份数据可以得到更干净的OO设计。
业务场景
假定现在有一个气象站类这个气象站类会不定时更新温度湿度气压的最新数据要求你在这些数值变化时立即通知一些气象局进行展示而他们得到的数据是一样的但是采用的展示手段可能是不一样的比如有的采用图示有的采用文字有的采用语音播报等给出设计代码。
代码案例
#include iostream
#include vector
#include algorithmusing namespace std;// 观察者抽象类
class Observer
{
public:virtual void update(const float tmp, const float hum, const float pre) 0;virtual ~Observer() {}
};// 展示抽象类
class Display
{
public:virtual void display() const 0;virtual ~Display() {}
};// 主题抽象类
class Subject
{
public:virtual void registerObserver(Observer* b) 0;virtual void removeObserver(Observer* b) 0;virtual void notifyObserver() const 0;virtual ~Subject() {}
};class WeatherData : public Subject
{
private:std::vectorObserver* observers;float temperature 0;float humidity 0;float pressure 0;public:WeatherData() : Subject() {}void registerObserver(Observer* b){observers.push_back(b);}void removeObserver(Observer* ob){auto it find(observers.begin(), observers.end(), ob);if (it ! observers.end()){observers.erase(it);}}// 通知观察者使得所有观察者更新信息。void notifyObserver() const{for (auto it : observers){it-update(temperature, humidity, pressure);}}void measurementsChanged(){notifyObserver();}// 设置气象站天气信息并通知观察者。void setMeasurements(const float tmp, const float hum, const float pre){temperature tmp;humidity hum;pressure pre;measurementsChanged();}~WeatherData(){for (auto each : observers){delete each;each nullptr;}}
};class CurrentConditionsDisplay : public Observer, public Display
{
private:float temperature 0;float humidity 0;Subject* weatherData nullptr;public:// 初始化信息板并在气象站对其登记。CurrentConditionsDisplay(Subject* wd) : Observer(), Display(){weatherData wd;weatherData-registerObserver(this);}// 更新天气信息并展示。void update(const float tmp, const float hum, const float pre){temperature tmp;humidity hum;display();}void display() const{cout 气象局1: 当前温度 temperature , 当前湿度 humidity endl;}~CurrentConditionsDisplay(){if (weatherData){delete weatherData;weatherData nullptr;}}
};class CurrentConditionsDisplay2 : public Observer, public Display
{
private:float temperature 0;float humidity 0;Subject* weatherData nullptr;public:// 初始化信息板并在气象站对其登记。CurrentConditionsDisplay2(Subject* wd) : Observer(), Display(){weatherData wd;weatherData-registerObserver(this);}// 更新天气信息并展示。void update(const float tmp, const float hum, const float pre){temperature tmp;humidity hum;display();}void display() const{cout 气象局2: 当前温度 temperature , 当前湿度 humidity endl;}~CurrentConditionsDisplay2(){if (weatherData){delete weatherData;weatherData nullptr;}}
};int main()
{WeatherData* wd new WeatherData();CurrentConditionsDisplay* cd new CurrentConditionsDisplay(wd);CurrentConditionsDisplay2* cd2 new CurrentConditionsDisplay2(wd);// wd修改天气信息 并通知展示板wd-setMeasurements(80, 65, 30.4f);wd-setMeasurements(60, 35, 32.1f);wd-removeObserver(cd);cout ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ endl;wd-setMeasurements(60, 35, 31.1f);return 0;
}