设计模式学习--观察者模式(observer)

来源:互联网 发布:java反序列化漏洞利用 编辑:程序博客网 时间:2024/05/23 02:10

模式意图

1  定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。



代码
public static void main(String[] args){WeatherData weatherData = new WeatherDate(); //主题// 新建两个观察者// 观察者构造方法中 对观察者进行注册Observer1 ob1 = new Observer1(weatherData);Observer2 ob2 = new Observer2(weatherData);// 更新气象数据时,所有观察者都将会被通知weatherData.setMeasurements(80,65,30);weatherData.setMeasurements(90,70,35);}WeatherData:具体主题public class WeatherData implements Subject{// 设置温度public void setMeasurements(float temperature,float humidity ,float pressure){this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;// 通知所有观察者notifyObservers();}// 通知所有观察者public void notifyObservers(){for(){Observer observer = (Observer)observer.get(i);observer.update( temperature, humidity , pressure);}}}Observer1:具体观察者public class Observer1 implements Observer{// 注册观察者public Observer1(Subject weatherData){weatherData.registerObserver(this);}// 实现观察者接口的update()方法public void update(float temperature,float humidity ,float pressure){// 实现业务方法display( temperature, humidity , pressure)}}


问题:

1 具体观察者一定要依赖主题吗?
不需要,subject注册观察者的代码可以移出Observer1,放到其它地方执行,从而去除观察者对主题的关系。
备注:《敏捷软件开发》P272中  图24.11的类图更是把主题和主题数据进行分离,理解起来更为清晰。
1.观察者关注只需要主题的数据,而非主题的业务对象。

推拉模式区别:

区别在于Observer接口参数
推:Observer接口参数为需要更新各个属性,拿气象数据例子来说参数可以使温度、湿度、压力等。
拉:Observer接口参数为主题对象(数据对象)即实现了Subject的实现类 WeatherData。
所以推荐在参数较少的情况下使用拉模式更加方便,但是当主题对象非常复杂参数很多,这样使用拉模式观察者获取数据时就更容易出错。




要点:

1、观察者模式定义了对象之间一对多的关系

2、主题用一个共同的接口来更新观察者

3、观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口

4、使用此模式时,你可从被观察者处推或拉数据

5、有多个观察者时,不可以依赖特定的通知次序

问题:

1 具体
原创粉丝点击