1
前言
本期分享设计模式主题:观察者设计模式。
这是一个非常简单易学的设计模式,读完本文,你能知道观察者模式的设计以及设计思想。
2
模式简介
这是一个可以帮助你的对象知悉现状,不会错过对该对象感兴趣的事。对象甚至在运行时可决定是否需要继续被通知。观察者模式也是JDK中使用最多的模式之一,非常有用。
3
模式定义
观察者模式是在对象之间,定义一对多的依赖关系。基于这样的关系,如果对象发生状态变化,与之依赖的多个对象(监听的对象)能够收到状态变化通知,并进行更新。是一个以松耦合的方式,让一个对象与一系列对象进行协作沟通的方式。
观察者模式有两种方式的实现,一种是推(push),另一种是主动拉(pull),推和拉都是针对通知而言。本着介绍推模式。
4
模式UML类图
观察者模式的UML类图如下图:
角色划分
Subject:主题或中心对象,一对多中的一,接口或抽象类。定义了如何添加观察者,移除观察者,通知观察者更新的基本行为。
Subject1和Suject2:是对主题的具体实现,可以通过实现Subject的接口实现不同种类的主题和中心对象。
Observer:观察者接口定义。定义观察者更新行为。
ObserverImpl1和ObserverImpl2:观察者的实现类,可以通过实现Observer接口实现不同的观察者,监听不同的主题。
5
代码实例
实例介绍
实例实现了一个天气中心,向一个当前天气显示器上通知最新的气象数据:温度、湿度、压强。气象显示器会更新显示的数据,并实时显示。
主题中心类:
具体主题实现类:
观察者接口定义:
观察者具体实现类:
测试代码:
输出:
6
JDK中的观察者模式
在JDK中已经提供了一套观察者模式的实现:Observable类相当于这里的Subject,Observer接口相当于这里的Observer接口
类图关系如下:
值得注意的是,JDK中的主题类时Observable类,并非一个接口。这是一个缺陷,因为要想通过JDK的API实现观察者模式,必须继承Observable类,并不满足面对接口编程的设计原则,如果某个类想具有Observable和其他另一个父类的功能,就陷入两难的境地。因为Java类并不支持多继承。
7
总结
1、封装变化的部分。
2、多用组合、少用继承:JDK中的观察者模式给了一个教训。
3、针对接口编程,不针对实现编程。
4、为对象之间的依赖关系达到松耦合设计而努力。
领取专属 10元无门槛券
私享最新 技术干货