首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

设计模式(二)观察者模式

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、为对象之间的依赖关系达到松耦合设计而努力。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180331G1HLRQ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券