对象间的联动——观察者模式(九)

目标与观察者之间的关系

       目标与观察者之间的关系可以是一对一、一对多、多对一。

单向依赖

       观察者和目标是单向依赖的关系,只有观察者依赖目标,而不是目标依赖观察者,观察者是被动的,目标是主动的。

命名建议

  1. 目标接口的定义,建议在名称后面跟Subject;
  2. 观察者接口的定义,建议在名称后面跟Observer;
  3. 观察者接口的更新方法,建议名称为update,参数的个数及类型不受限制。

触发通知的时机

       一般情况是在完成目标对象的状态维护后触发通知,因为通知会传递数据,不能够先通知再改变数据。比如之前的代码,先设置天气内容,再通知所有的订阅的人:

1
2
3
4
5
6
7
8
9
10
public class ConcreteWeatherSubject extends WeatherSubject {

...

public void setWeatherContent(String weatherContent) {
this.weatherContent = weatherContent;
//内容有了,说明天气更新了,通知所有的订阅的人
this.notifyObservers();
}
}

观察者模式的调用顺序示意图

  • 观察者模式的调用顺序(准备阶段)
    观察者模式的调用顺序(准备阶段)

  • 观察者模式的调用顺序(运行阶段)
    观察者模式的调用顺序(运行阶段)

通知的顺序

       多个观察者之间的通知顺序是不确定的,彼此之间是平行的,观察者之间不应该有相互依赖的关系。

参考资料:
GerryZhang 认识观察者模式

Fork me on GitHub