设计者模式二:观察者模式
设计原则:为了交互对象之间的松耦合设计而努力。
定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
深化:(松耦合的威力) 当两个对象之间松耦合,对象之间依然可以交互,但是不太清楚彼此的细节,观察者模式提供一种对象设计,让主题和观察者之间松耦合。
关于观察者的一切,主题值知道观察者实现了某个接口,主题不需要知道观察者的具体类是谁,做了些什么或其他任何细节。
任何时候我们都可以用新的观察者取代现有的观察者,主题不会受到影响。加入观察者要求也就是实现指定接口即可。
解释:对于一对多的关系有何关联
利用观察者模式,主题是具有状态的对象,并且可以控制这些状态,观察者课使用这些状态,依赖主题来告诉他们状态何时改变。
实际问题:
气象监测应用:
气象站提供WeathData对象负责追中目前的天气状况(包括几个温度的参数),
建立一个应用,有三种布告板,分别显示目前的状况,气象统计...要求:当WeatherObject对象获得最新的测试数据时,三种布告板必须实事更新。
做法1:
在Weather中加入代码:获取到温度参数,创建布告板的对象,然后直接调用布告板对象的update方法
问题:
1. 这是针对具体实现的编程,而非针对接口的编程
2. 对于每一个新的布告板,我们都得修改代码
3. 我们无法在运行时动态的增加或删除布告板
做法2:创建两个接口另加一个显示的接口
1.Subject接口被称为主题接口,对象使用此接口注册为观察者,或者把自己从观察者中删除,需要的方法:RegisterObserver();removeObserver();notifyObservers();
实现类。加入参数包括传给观察者的信息,如温度;还有一个List集合用来存储着观察者,在类的构造函数中new ArrayLIst();
可以加入getXX的方法,可以用于观察着自定义获取到的内容,
measurementsChanged()这个方法中调用notifyObservers();
在一个方法setMeasurements(x。。。)这个方法是提供修改信息的,然后下面调用measurementsChanged()方法
2.Observer接口:所有潜在的观察者必须实现这个接口,这个接口只有update()方法,当主题状态变化时调用它
可选3.三个布告板都需要显示的功能,定义一个显示的接口
继承类中需要有一个主题的属性weatherData,用于自动设置加入观察者的对于中,在构造方法中设置this.WeatherData=weatherData;weatherData.registerObserver(this)。
同时重写update方法,方法的参数可以是具体的参数,或者是一个WeatherData对象,这样可以随便设置获取到的值。
问题1:没有设置,观察者主动去获取数据,每次都是观测者发送数据,但是观察者此时可能有更重要的事情要处理。
问题2:有的观察者每次只需要一点点数据,但是这种做法每次都是推送全部的信息过来,迫使观察者接受,同时以后观测者决定扩展功能,新增更多的状态,就需要修改和更新对每位观察者的调用, 希望在观测者提供get方法由观察者调用
做法3:java内置的观察者模式 解决上述问题
http://blog.csdn.net/a19881029/article/details/8975962