在观察者模式一章中,Head Fist一书主要是通过“气象台”的例子,来讲解优化代码,并将观察者模式自然而然的融入进去。
本例粗略介绍:有一个屌丝互联网公司赢得了一家气象台的合约,气象台要求如下:气象台给提供WeatherData源文件,互联网公司可以根据源文件获取里面的气象数据,然后根据这些数据去公布一组API,可以让其他的开发人员根据这组API去写出自己的气象布告板。
本例主要要解决的问题:每个布告板所需参数数量、种类可能不一样,布告板数据需要根据WeatherData中的数据进行实时变化,布告板的新增应对原有代码影响到最小。
本章中出现的设计原则:为了交互对象之间的松耦合设计而努力。
注解:松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。
观察者模式的定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
观察者模式的适用条件:一个对象状态的改变对其他多个对象有影响。
观察者模式的两种实现方式:
一:自己创建可观察者与观察者的接口及实现类。(推荐采用此方式)
1.定义可观察者接口,接口中包括注册、删除、通知观察者方法。根据需求实现该接口,并设置一个状态改变标记,只有当状态改变时才能调用通知方法。在其中需设置一个全局的接收观察者对象的数组或list,以供注册、删除方法使用,还有在通知观察者时,先对数组进行遍历,再调用具体观察者里面的update方法使得观察者得到数据后做出相应的操作。如有需要还需创建获取数据setter方法或者getter方法,以便可观察者推送数据给观察者或观察者从可观察者中拉取数据。若设setter方法则需在setter数据后调用其中的通知方法,因为setter模拟的是数据的改变,数据改变后需要对观察者进行通知操作。
2.定义观察者接口,在其中定义update方法。根据需求实现该接口,并在实现类的构造器中将当前实现类注册到可观察者对象中。然后对update具体的方法进行实现。在update中接收可观察者传来的数据,并按需求对数据进行操作。
3.在具体测试或者使用时,先初始化具体的观察者,将其注册到可观察者中,然后调用可观察者的数据更新的方法(在此例中是setter方法模拟数据的改变)即可。
二:可观察者:继承:java.util.Observable类。观察者:实现:java.util.Observer接口。
接下来的操作基本上和一方法相似。
注意事项:在实现时应时刻受到设计原则:面向接口编程的约束,勿随意创建新对象,采用具体对象里的方法,应采用接口中的方法通过多态去调用具体的实现方法。