美文网首页
观察者模式--《HeadFirst设计模式》

观察者模式--《HeadFirst设计模式》

作者: 吕建雄 | 来源:发表于2021-03-13 09:35 被阅读0次

观察者定义了对象之间一对多的关系

主体(也就是可观察者)用一个共同的接口来更新观察者

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

你的团队刚刚赢的一纸合约,负责建立Weather-O-Rama公司的下一代气象站--Internet气象观测站

此系统的三个部分是气象站(获取实际气象数据的物理装置)、WeatherData对象(追踪来自气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看);

目前我们知道什么呢?

1、WeatherData类具有getter方法,可以获取三个测量值:温度、湿度与气压

2、当新的测量数据备妥时,measurementsChanged()方法就会被调用(我们不在乎此方法时如何被调用的,我们只在乎它被调用了)

3、需要实现三个布告板:“目前状况”、“气象统计”、“天气预报”布告。一有WeatherData更新数据,这些布告必须马上更新

4、此系统必须可扩展

简单实现

上面实现存在的问题?

1、针对具提实现编程,会导致以后在增加或删除布告板时必须修改程序

2、改变的地方,没有封装起来(上面.update方法的调用)

3、.update方法,看起来像是一个统一的接口;没有实现一个共同的接口

现在来看看观察者模式

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

如果了解报纸订阅是怎么回事,其实就知道观察者模式怎么回事,这是名词不太一样:

出版者改称为“主题“Subject,订阅者改称为”观察者“Observer

来更仔细的了解一点:

主题对象:主题对象管理某些数据;当主题内的数据改变,就会通知观察者,一旦数据改变,新的数据就会以某种形式送到观察者手上

观察者:观察者已经订阅(注册)主题以便在主题数据改变时能够收到更新

定义观察者模式

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

主题和观察者定义了一对多的关系。观察者依赖与此主题,只要主题状态一有变化,观察者就会被通知。

问:观察者和一对多的关系有何关联?

答:利用观察者模式,主题是有状态的对象,并且可以控制这些状态。另一方面,观察者使用这些状态,虽然这些状态不属于他们。有许多的观察者,依赖主题来告诉他们状态何时改变了。这就产生一个关系:“一个”主题对“多个”观察者的关系

问:期间的依赖如何产生的?

答:因为主题是真正拥有数据的人,观察者是主题的依赖者,在数据变化时更新。这样比起让许多对象控制同一份数据来,可以得到更干净的OO设计

松耦合的威力

当两个对象之间松耦合,他们依然可以交互,但是不太清楚彼此的细节

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

观察者模式,类图如下:

观察者模式

观察者模式代码实现:

接口类 weatherData类 具体观察者 测试类

总结:

OO基础:

封装、继承、多态、抽象

OO原则:

封装变化

多用组合,少用继承

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

为交互对象之间的松耦合设计而努力

观察者模式具体代码实现

相关文章

网友评论

      本文标题:观察者模式--《HeadFirst设计模式》

      本文链接:https://www.haomeiwen.com/subject/tttzqltx.html