背景:建立一个应用,利用后台的核心对象WeatherData获取气象站的数据,并更新应用的的三个布告板:目前状况、气象统计和天气预报。一旦后台的WeatherData数据有更新,布告板应该马上更新,或者知道数据更新了,从而执行刷新操作。系统应该可扩展,让用户可以随心所欲的添加删除布告板。
此题主要是讲观察者模式,那么解决此问题的办法自然是观察者模式,先看看什么是观察者模式。
观察者模式
在这里WeatherData,从探测器处获取数据,从而持有数据,然后布告板有N个,当数据变化时每个布告板都从WeatherData处获取一样的数据来更新各自的布告板,那么可以理解:N个布告板从WeatherData处订阅数据,当WeatherData的数据出现变化时,便广播给布告板,它们一对多的关系,此处将WeatherData称之为‘主题’,布告板称为‘观察者’,‘主题’+‘观察者’=观察者模式
实现观察者最常见的是包含Subject与Observer接口的类设计,关系看以下类图
Subject接口定义主题的订阅、取消订阅等方法。Subject的实现类即真正的主题(仅一个实现)、数据的持有者,使用ArrayList集合来记录实现了Observer接口的订阅者(多个实现)。观察者持有Subject的引用,方便注册订阅、取消订阅。