筹划模式:2. 观察者模式

[复制链接]
发表于 2026-6-14 15:25:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
笔者现在正在阅读《Head First筹划模式》,起首对该书发表我的个人观点,非常风趣生动的一本书,在阅读这本书之前,我不停对筹划模式抱有畏惧的生理,阅读该书之后,才发现筹划模式可以这么普通易懂,保举各位去阅读原书。为加深知识印象,对书中内容举行梳理总结,书中的案例均由Java实现,而笔者本人现在重要使用C++,因此该文章通过C++来形貌案例。由于本人水平有限,表达会有欠佳处,若要深入明白筹划模式,照旧保举读者可以大概阅读原书。
这次,我们收到了一个景象站的需求,景象站会将丈量到的温度、湿度与气压等数据告诉我们,我们须要筹划一个体系将景象情况在差异的装备上举行表现(表现的方式,表现须要的数据大概都不雷同)。现在,我们通过一个WeatherData类来罗致数据信息,并将他们表现到装备上。接下来我们假想了第一个版本。
  1. class WeatherData
  2. {
  3. public:
  4.   // 此处省略赋值显示设备的相关代码
  5.   void setMeasurements(float temperature, float humidity, float pressure)
  6.   {
  7.     // 假设当测量到的数据发生变化时,会自动调用该函数。
  8.     m_temperature = temperature;
  9.     m_humidity = humidity;
  10.     m_pressure = pressure;
  11.     measurementsChanged();
  12.   }
  13.   void measurementsChanged()
  14.   {
  15.     // 更新设备中的显示内容
  16.     m_device1->update(m_temperature, m_humidity, m_pressure);
  17.     m_device2->update(m_temperature, m_humidity, m_pressure);
  18.     m_device3->update(m_temperature, m_humidity, m_pressure);
  19.   }
  20.   
  21. private:
  22.   float m_temperature;  // 温度
  23.   float m_humidity;  // 湿度
  24.   float m_pressure;  // 气压
  25.   DisplayDevice* m_device1;
  26.   DisplayDevice* m_device2;
  27.   DisplayDevice* m_device3;
  28. };
复制代码
可以看到,持有状态的这个对象(WeatherData)和装备耦合在了一起。假如我们须要增长一个表现装备呢,又或则某一个装备不再想要这些信息了,这时间就必须修改代码。这显然不是一个好的筹划方式。我们要尽大概依照一个筹划原则:为交互对象之间的松耦合筹划而积极。
既然他们耦合到一起了,那么我们怎样想办法解耦呢?状态对象不须要知道有哪些类依赖了它,我们自然的想到了接口。假如有一个接口,它声明白update()函数,全部的装备都继承这个接口,如许WeatherData就不必知道有哪种装备须要update(),它只须要调用接口的update()函数,通过多态,各种范例的装备自然可以大概通过自己的方式展示数据。
之后,我们又遐想到报纸和杂志的订阅,假如我们欣赏报纸时,只须要向某家报社订阅报纸,只要他们有新的报纸出书,就会给你送来。当你不再想看时,只须要取消订阅。
在我们的例子中,WeatherData就是提供报纸的报社,各个装备须要订阅WeatherData中的数据。
我们先来实现刚刚提到的接口,全部实现这个接口的类就是须要订阅报纸的客户,也就是观察者。
  1. class Observer
  2. {
  3. public:
  4.   virtual void update(float temperature, float humidity, float pressure) = 0;
  5. };
复制代码
差异的表现装备都会实现这个接口
[code]class Phone: public Observer{public:  void update(float temperature, float humidity, float pressure)  {    std::cout
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表