观察者模式
总述:
设计原则:
为交互对象之间的松耦合设计而努力。
设计模式:
观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖他的对象都会收到通知,并自动更新。
观察者模式中有两类对象:主题和观察者。
主题只有一个,观察者有许多。
常见的应用场景:数据更新到客户端
他们之间的依赖关系:因为主题是拥有数据的人,观察者是主题的依赖者,在数据变化更新时,这样比起让许多对象控制同一份数据来说,可以得到更干净的OO设计。
常见的观察者模式的类图设计
主题接口:对象使用此类接口注册成为观察者,或者把自己从观察者中删除
观察者接口:所有潜在的观察者必须实现观察者接口,这个接口只实现update()这一个方法,当状态改变时,它被调用。
具体主题类:实现主题接口,除了注册和和撤销方法之外,具体主题还要实现notifyObserver()的方法,此方法用于在状态改变时更新所有当前观察者。
具体主题类也可能有设置和获取状态的方法。
下面来介绍一下松耦合。
当两个对象处于松耦合状态,他们依然可以交互,但是不太清楚彼此之间的细节。
所以松耦合顾名思义,即利用接口来实现对象与对象之间的关系,以达到改变主题或观察者的其中一方,保证另外一方的代码不需要修改。
松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为把对象之间的相互依赖降到了最低。
之所以利用接口作为载体是因为每个观察者观察的角度是有差异的,我们只需做到把数据的传输统一在两个接口之间即可。
松耦合带来的实用场景:
保证主题不受影响的情况下:
• 任何时候我们都可以增加新的观察者,要做的只是在新的类里实现观察者接口。
• 可以用新的观察者取代现有的观察者。
所以这里引出了一个新的设计原则:
设计原则:为交互对象之间的松耦合设计而努力。
实战案例:设计气象站
下面我们要依照上面的类图来实现这个系统了
我们这里选择不去调用Java内置的支持,自己动手创建。
首先我们来建立接口:
接下来在WeatherData类中实现主题接口:
现在我们来建立Observer接口的实现类:
最后建立调试类验证程序:
结果:
至此,我们再把观察者模式的行为具体一些:
观察者模式其中很大的意义是保证主题的安全性。
观察者模式相比于正常的getter,setter方法,更像是主题将数据通过update方法“推”出来,而getter方法更像是“取”出来的感觉。