设计模式之观察者模式
观察者模式是对象的行为模式,又叫“发布-订阅模式”。由名字就能够得知,观察这模式构造了一个发布者和订阅者。
观察者模式定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项。在观察者模式中,主动发生改变的是发布者称为主题,而被动收到发布者信息的订阅者称为观察者对象,可以根据需要添加/减少具体主题的观察者,实现主题和观察者之间的松耦合。
应用场景
当设计中有两种不同方面的抽象,并且是有依赖关系的,这时将两个抽象分别封装到具体的类中,这样就能够独立的改变和重用这些对象。在观察者模式中两种抽象指的就是抽象主题和抽象观察者。
当一个对象需要更改时,涉及到更改其他类型的其他对象,并且这些对象的数量多且不确定的时候。
当一个对象改变时,其他对象能够得到这个对象已经改变的通知,而不必知道这些对象具体是什么。也就是说要达到这个改变的对象和通知的对象的松耦合。
所以综上:
当希望一个对象改变的同时,多个对象能够得到通知,一块进行变更时,可以使用观察者模式对系统设计
模式结构
上图中:
Weather
为抽象主题类,能够将观察者Observer
构成一个list
结构,从而能够达到Weather
改变的时候可以循环表中的观察者,发送通知。并且作为抽象类实现了添加,移除观察者方法。BeijingWeather
为具体主题类,实现了Weather
类。Observer
作为抽象观察者类,作为所有观察者的通用接口,其中定义update
方法作为更新状态的接口。通过这个接口和Weather
类交互来获取状态通知。WeatherObserverA
与WeatherObserverB
作为具体观察者类,实现类观察者接口。统一接受通知并更新自身状态。
代码
第一部分:抽象主题类
1 | // 状态枚举类 |
第二部分:具体主题类
1 | public class BeijingWeather extends Weather { |
第三部分:抽象观察者
1 | public interface Observer { |
第四部分: 具体观察者
1 | public class WeatherObserverA implements Observer { |
最后调用
1 | public class App { |
结果:最后注册在主题上的所有观察者都收到了通知。
1 | observer A get new weather message is SUNNY_DAY |