《headfirst设计模式》读书笔记2-观察者模式

1.模式的演进

1.1 气象监测应用

气象监测应用:
WeatherData对象:
拥有方法:getTemperature()(获取温度)、getHumidity()(获取湿度)、getPressure()(获取气压)、measurementsChanged()(一旦气象测量更新,此方法就会被调用)
三个布告板:一旦WeatherData有新的测量,布告马上更新

在这里插入图片描述
在这里插入图片描述

1.2 错误示范

这是最常见且直接的写法
缺点:针对具体编程,一有新的变化就要改变这段代码

在这里插入图片描述

1.3 观察者模式

观察者模式提供一种对象设计,让主题和观察者之间松耦合
从类图我们可以知道:
1.该模式将主题和观察者两个类(接口)进行了关联
2.通过将两个接口关联,这样一个主题类可以通过实现对观察者接口进行关联实现对所有观察者的关联(比如主题想通知观察者,只需要调用观察者接口的update就可以),实现了对接口编程

在这里插入图片描述

2.总类图及实现

主要的实现:
主题需要有保存所有需要通知的观察者容器
观察者需要由统一的通知方法,以供主题调用进行通知

2.1 总类图

在这里插入图片描述

2.2 部分源码

2.2.1 Subject.h

#include "Observer.h"
class Subject{
public:
    virtual void registerObserver(Observer *o)=0;
    virtual void removeObserver(Observer *o)=0;
    virtual void notifyObservers()=0;
    virtual ~Subject(){};
};

2.2.2 WeatherData.h

#include "Subject.h"
#include "Observer.h"
#include <vector>
using std::vector;
class WeatherData:public Subject{
public:
    WeatherData();
    virtual void registerObserver(Observer *o)override final;
    virtual void removeObserver(Observer *o)override final;
    virtual void notifyObservers()override final;
    void measurementsChanged();
    void setMeasurements(float temperature,float humidity,float pressure);

    virtual ~WeatherData();
private:
    vector<Observer *> observers;//利用容器存起来
    float temperature;
    float humidity;
    float pressure;
};

2.2.3 Observer.h

class Observer{
public:
    virtual void update(float temperature,float humidity,float pressure)=0;
    virtual ~Observer(){};
};

2.2.4 CurrentConditionsDisplay.h

#include "DisplayElement.h"
#include "Observer.h"
#include "Subject.h"
class CurrentConditionsDisplay:public DisplayElement,public Observer{
public:
    CurrentConditionsDisplay(Subject *weatherData);
    virtual void update(float temperature,float humidity,float pressure)override final;
    virtual void display()override final;
    virtual ~CurrentConditionsDisplay();
private:
    float temperature;
    float humidity;
    Subject *weatherData;
};

3. 使用java内置的观察者模式

java内置类的观察者模式:
观察者是一个类,而不是一个接口
首先,因为Observable是一个“类”,你必须设计一个类继承它。如果某类想同时具有Observable类和另一个超类的行为,就会陷入两难,毕竟java不支持多重继承。
再者,因为没有Observable接口,所有你无法建立自己的实现,和java内置的Observer API搭配使用,也无法将java.util的实现转成另一套做法的实现。

在这里插入图片描述

4. setChanged()方法-标记状态改变

在这里插入图片描述

5. 总结

1.松耦合的威力
在这里插入图片描述
2. 观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新
3. 设计原则:为交互对象之间的松耦合设计而努力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗吧!骚年!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值