设计模式学习之路--观察者模式
1、观察者模式描述
关于什么是观察者模式,我们拿报社和订阅者的关系用比较通俗的语言来描述一下:
1、报社的业务就是出版报纸。
2、向某家报社订阅报纸,只要他们有新的报纸,就会给你送来。只要你是它的订阅者,你就会收到新的报纸。
3、当你不想再看报纸的时候,取消订阅,他们就不会再送新报纸来。
4、只要报社还在运营,就回一直有人来向他们订阅报纸。
由此可以总结出:出版者+订阅者=观察者模式。
我们把出版者称为主题(Subject)把订阅者称为观察者(Observer),我们通过一个图来看一下他们的关系:
当主题发生了变化,它就会通知所有的订阅者我发生了改变,当然作为订阅者也是可以取消订阅的,取消订阅之后,那就接受不到主题改变的通知了。
2、在项目中实现观察者模式
我们直接运用《Head First设计模式》中的案例来进行一步一步的阐述
气象站应用:气象站的物理检测设备,把检测到的数据(WeatherData:这个源码气象站会提供给我们)提供给我们,我们把得到的数据显示在布告板上.
WeatherDa对象知道如何跟物理气象站联系,以取得更新的数据。WeatherData会随即更新布告板的显示。布告板目前有3个:目前的状况(温度、湿度、气压)、气象统计、天气预报。
1、那么我们将进行怎么的实现呢
首先我们看一下源码:
WeatherData
{
getTemperature()
getHumidity()
measurementsChange()
//其他的方法
}
public void measurementsChange(){
{
//你的代码加在这里
}
一旦气象测量更新,此方法会被调用
我们可能会想,既然气象测量更新measurementsChange就会被调用,我们直接在measurementsChange中编写业务逻辑代码不就行了吗
这样确实可以实现这个功能,但是我们造成其他后续的很多问题:
1、我们这样是针对具体实现编程,而非针对接口编程
2、对每个新的布告板,我们都得修改代码
3、我们无法在运行是动态的增加删除布告板
4、我们尚未封装改变的部分
既然我们已经了解观察者模式的原理了,那我们就直接的用观察者模式来实现这些业务吧
1、我们首先定义一下主题(Subject)的接口
subject接口具有的功能:注册、删除、更新
subject接口具有的功能:注册、删除、更新
public interface Subject{
void registerObserver()
void removeObserver()
void notifyObserver()
}
2、定义观察者的接口
Observer接口具有的功能:更新
public interface Observer{
{
void update()
}
3、因为不同布告板的更新数据都是一样的,那么我们就写一个公用的接口,这样我们可以每个布告板都实现这个接口,而且我们的代码也松耦合了
public interfaceDisPlayElement{
{
void display()
}
下面是相应 的实现和继承的类图
具体的事件代码如下图:
从上面的代码中我们可以看到主题通过一个数组来进行对观察者的管理;观察者的构造器需要weatherData对象,用来进行注册用,通过这些观察者模式已经构建完成了。
3、内置的观察者模式
Java本身是有观察者模式的
1、只需要导入Java.util.Observable和Java.util.Observer
具体我们就不实现了,但是我们会注意到Observable和Observer这是两个类而不是接口,这就违反了我们针对接口编程,而非针对实现编程。
2、如果我们看JDK的源码,我们会发现有很多地方都可以找到她的身影。
4、设计原则与设计模式
设计模式的实现离不开设计原则,所以我们在了解设计模式的原理的基础上更应该去熟悉的使用设计原则。
下面列出一些这个设计模式中用到的设计原则:
1、封装变化
2、多用组合,少用继承
3、针对接口编程,不针对实现编程
4、为交互对象之间的松耦合设计而努力
分享出来大家共同学习,不喜勿喷!!!谢谢!!!