设计模式 观察者模式

本文将介绍设计模式中的观察者模式。

一、什么是观察者模式?

观察者模式又被称为发布 - 订阅模式,用于建立对象与对象之间的依赖关系,一个对象发生变化时将自动通知其它对象,以便其它对象做出相应反应。

二、实现

1. 结构

2. 角色

  • Subject 目标:
    • 被观察的对象
    • 在目标中定义了一个观察者集合,可以放置若干个观察者,同时提供了一系列方法用于维护该集合
    • 定义了通知方法 notify(),用于通知观察者
  • ConcreteSubject 具体目标
  • Observer 观察者:
    • 观察者将对观察目标的改变做出反应
  • ConcreteObserver 具体观察者

3. 简单示例

Subject:

1
2
3
4
5
public abstract class Subject {
protected List<Observer> observers = new ArrayList();

public abstract void notify();
}

ConcreteSubject:

1
2
3
4
5
6
7
public class ConcreteSubject extends Subject {
public void notify() {
for (Observer observer : observers) {
observer.update();
}
}
}

Observer:

1
2
3
public interface Observer {
void update();
}

ConcreteObserver:

1
2
3
4
5
public class ConcreteObserver implements Observer {
public void update() {
// ···
}
}

三、JDK 对观察者模式的支持

java.util 包中,提供了 Observable 类以及 Observer 接口,可以通过它们更方便地应用观察者模式。

四、优缺点

1. 优点

  • 在观察目标和观察者之间建立了一个抽象的耦合
  • 符合开闭原则,增加新的观察者时无需修改代码

2. 缺点

  • 如果观察目标和观察者之间存在循环依赖,将会导致循环调用

参考

  • 《Java 设计模式》