目录
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. 设计原则:为交互对象之间的松耦合设计而努力