《设计模式》读书笔记:观察者模式

来源:互联网 发布:软件开发经理岗位职责 编辑:程序博客网 时间:2024/05/15 09:09

公司拿到了一个气象观察站的项目,气象站的专利中有一个WeatherData对象,能够追踪目前的天气状况(温度,适度,气压).

气象站希望我们设计的布告板系统,能够根据Weather对象的反馈,及时刷新不同布告板上的数据.

Weather对象,已经实现了getTemperature(),getHumidity(),getPressure(),提供了获取三个参数的方法,以及更新数据时的回调函数measurementsChanged().

现在,我们已经提交了第一个版本的代码------"老掉牙"模式的流程:

(1)初始化布告板对象a,b,c.

(2)当measurementsChanged()方法调用时,调用getter方法获取数据,然后调用布告板对象的update方法,将获取的数据传入.

看看这样的设计有什么问题吧?

当布告板a需要停止使用,或者需要再添加一个布告板d的时候,显然需要修改代码.更不用说,实时添加/删除布告板.

那么,接下来我们看看观察者模式,先从报纸订阅说起:

(1)报社的业务就是出版报纸.

(2)向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来.只要你是他们的订户,你就会一直收到新报纸.

(3)当你不想再看报纸的时候,取消订阅,他们就不会再送新报纸来.

(4)只要报社还在运营,就会有人向他们订阅或取消订阅报纸.

仔细想想就会发现,其实和我们的需求几乎一样.

我们将发布详细的对象称为"主题"(Subject),需要接受/订阅消息的对象称为"观察者"(Observer).

布告板a,b,c都需要成为WeatherData对象这个主题的观察者,当measurementsChanged()发生时,主题也只需要通知其观察者列表中的布告板对象.

同时,因为观察者列表的灵活性,实时添加/删除布告板也是必然的.

观察者模式体现了另一个设计原则: 为了交互对象之间的松耦合设计而努力.

松耦合的威力 : 当两个对象之间松耦合,他们依然可以交互,但是不用清除彼此的细节.

0 0
原创粉丝点击