1. 定义

定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并更新

2. 案例

主题对象:Subject

  1. class Subject {
  2. //容器
  3. private List<Observer> container = new ArrayList<>();
  4. // add
  5. public void addObserver(Observer observer) {
  6. container.add(observer);
  7. }
  8. //remove
  9. public void remove(Observer observer) {
  10. container.remove(observer);
  11. }
  12. //notify
  13. public void notifyObserver(Object object) {
  14. for (Observer observer : container) {
  15. observer.update(object);
  16. }
  17. }
  18. }

观察者:Observer

  1. interface Observer {
  2. void update(Object object);
  3. }

依赖着:Task1、Task2

  1. class Task1 implements Observer {
  2. @Override
  3. public void update(Object object) {
  4. System.out.println("task1 received: " + object);
  5. }
  6. }
  7. class Task2 implements Observer {
  8. @Override
  9. public void update(Object object) {
  10. System.out.println("task2 received: " + object);
  11. }
  12. }

使用

  1. public static void main(String[] args) {
  2. Subject subject = new Subject();
  3. Task1 task1 = new Task1();
  4. Task2 task2 = new Task2();
  5. subject.addObserver(task1);
  6. subject.addObserver(task2);
  7. subject.notifyObserver("xxxxxx");
  8. //task1 received: xxxxxx
  9. //task2 received: xxxxxx
  10. subject.remove(task1);
  11. subject.notifyObserver("yyyyy");
  12. //task2 received: yyyyy
  13. }

3. 应用场景

当更改一个对象的状态可能需要更改其他对象,并且实际的对象集事先 未知或动态更改时,请使用观察者模式。

4. 优点

  1. 符合开闭原则
  2. 可以在运行时建立对象之间的关系

    5. JDK&Spring源码中的应用

    1. JDK:
    2. java.util.Observable
    3. Spring:
    4. org.springframework.context.ApplicationListene