#设计模式之观察者模式(Observer Pattern)

系列文章目录


前言

本文章是在阅读《Head First 设计模式》时所做的笔记。


一、令人懵逼的定义

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

二、通过一个案例来理解

1.问题描述


如图所示,是一个气象监测应用,它由气象站(获取实际气象数据的物理装置)、WeatherData对象(追踪来自气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看)组成。

注意
我们无需关心气象站如何获取数据,只需知道通过WeatherData对象可以获取当前最新的气象数据即可,且每当气象数据更新时,WeatherDaa 的measurementsChanged方法就会被调用。我们的工作就是实现该方法,使得气象数据一更新就同步更新布告板所显示的数据。

2.解决方法

1. 一个错误示范

public class WeatherData {

	public void measurementsChanged() {
		float temp = getTemperature();
		float humidity = getHumidity();
		float pressure = getPressure();
		// 下面是三种类型的布告板对象
		currentConditionDisplay.update(temp, humidity, pressure);
		statisticsDispaly.update(temp, humidity, pressure);
		forecasDisplay.update(temp, humidity, pressure);
	}
}

一种解决方法就是获取当前最新数据,然后依次调用布告板对象的update方法将数据传给布告板。

缺点:

  1. 每增加或减少布告板我们就需要对WeatherData对象进行修改
  2. 无法在运行时动态地添加或减少布告板

2.观察者模式

观察者模式中有两个重要的概念,分别为主题观察者

主题对象管理某些数据,即上面的WeatherData对象,当主题内的数据更新时就会通知观察者
观察者对象订阅主题,以便在主题数据改变时能够收到更新,即上面的布告板对象

下面是观察者模式的一个通用类图:

所有观察者都将实现Observer接口,这样对于主题对象来说,只需持有一个保存Observer的列表,通知时遍历该列表即可,同时也可以在运行时动态地像列表中添加或移除观察者对象。

3.使用观察者模式设计气象站


总结

观察者模式帮助我们降低了对象之间的依赖关系,变为松耦合的状态,使得我们可以灵活的对系统进行修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级无敌大卤蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值