观察者模式

观察者模式 = 出版者+订阅者

                     = subject + Observer

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新


1.      系统包含气象站(获取实际气象数据的物理装置)WeatherData对象(追踪来自气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看)。利用WeahterData对象获取数据,并更新三个布告板:目前状况、气象统计和天气预报。

——源代码返回最近的气象测量数据(温度、湿度、气压)

——getTemperature() / getHumidity() / getPressure()

——从气象站获取更新信息

——measurementsChanged()

——一旦WeatherData有新的测量,布告必须马上更新

——系统必须可扩展,建立定制的布告板,随心所欲添加删除任何其他布告板


public void measurementsChanged(){

       float temp = getTemperature();

       float humidity = getHumidity();

       flaot pressure = getPressure();

 

       currentConditionDisplay.update(temp, humidity,pressure);

       statisticsDisplay.update(temp, humidity, pressure);

       forecastDisplay.update(temp, humidity, pressure);

}

 

-----> 针对具体实现编程,而不是针对接口

-----> 每个新的布告板都得修改代码

-----> 尚未封装改变的部分

-----> 无法在运行时动态添加删除布告板


2.      观察者模式

public interface Subject{

           public void registerObserver(Observer o);   //需要观察者作为变量,注册或删除

public void removeObserver(Observero);

public void notifyObserver(Observero);    //主题状态改变,通知所有观察者

}

public interface Observer{

       public void update(flaot temp, float humidity, floatpressure);

}

public interface DisplayElement{

       public void display();

}

 

——主题必须主动送出状态和通知大家

——观察者主动索取数据,主题受到危险

——状态需要能“推”“拉”

设计原则:

当两个对象之间松耦合,依然可以交互,但是不太清楚彼此的细节——主题和观察者之间松耦合

找出程序中会变化的方面,将其和固定不变的方面相分离

针对接口编程,不针对实现编程

多用组合,少用继承

新类型的观察者出现时,主题的代码不需要修改;

独立地复用主题或观察者;

改变主题或者观察者一方,不会影响另一方;

松耦合设计让我们建立有弹性的OO系统,能够应该对变化,因为对象之间的互相依赖降到了最低。

3.      Java内置的观察者模式


Observer是一个“类”,而不是一个接口

WeatherData继承了超类的register(), remove(), notifyObservers()

——把对象变成观察者:addObserver,deleteObserver

——主题送出通知:先调用setChanged(),notifyObservers()notifyObservers(Object arg)

——观察者接收通知:update(Observable o, Objectarg)

 

——没有Observable接口,无法建立自己的实现,和Java内置的Observer API搭配使用,无法将java.util的实现转换成另一套做法的实现

——不要依赖观察者被通知的次序




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值