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