观察者模式Observer

原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11409319.html

 

1. 定义
定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

 

2. 结构图

Subject:目标对象,通常具有如下功能。

  • 一个目标可以被多个观察者观察。
  • 目标提供对观察者注册和退订的维护。
  • 当目标的状态发生变化时,目标负责通知所有注册的、有效的观察者。

Observer:定义观察者的接口,提供目标通知时对应的更新方法,这个更新方法进行相应的业务处理,可以在这个方法里面回调目标对象,以获取目标对象的数据。
ConcreteSubject:具体的目标实现对象,用来维护目标状态,当目标对象的状态发生改变时,通知所有注册的、有效的观察者,让观察者执行相应的处理。
ConcreteObserver:观察者的具体实现对象,用来接收目标的通知,并进行相应的后续处理,比如更新自身的状态以保持和目标的相应状态一致。

 

3. 本质
观察者模式的本质:触发联动。

 

4. Code Demo

Observer.java

1 package org.fool.dp.observer;
2 
3 public interface Observer {
4     void update(String str);
5 }

ConcreteObserver.java

1 package org.fool.dp.observer;
2 
3 public class ConcreteObserver implements Observer {
4     @Override
5     public void update(String str) {
6         System.out.println(str);
7     }
8 }

Subject.java

1 package org.fool.dp.observer;
2 
3 public interface Subject {
4     void addObserver(Observer observer);
5 
6     void removeObserver(Observer observer);
7 
8     void notifyObservers(String str);
9 }

ConcreteSubject.java

 1 package org.fool.dp.observer;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class ConcreteSubject implements Subject {
 7     private List<Observer> observerList = new ArrayList<>();
 8 
 9     @Override
10     public void addObserver(Observer observer) {
11         observerList.add(observer);
12     }
13 
14     @Override
15     public void removeObserver(Observer observer) {
16         observerList.remove(observer);
17     }
18 
19     @Override
20     public void notifyObservers(String str) {
21         for (Observer observer : observerList) {
22             observer.update(str);
23         }
24     }
25 }

Test.java

 1 package org.fool.dp.observer;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         Subject subject = new ConcreteSubject();
 6 
 7         Observer observer1 = new ConcreteObserver();
 8         Observer observer2 = new ConcreteObserver();
 9         Observer observer3 = new ConcreteObserver();
10 
11         subject.addObserver(observer1);
12         subject.addObserver(observer2);
13         subject.addObserver(observer3);
14 
15         subject.notifyObservers("hello world");
16 
17         subject.removeObserver(observer2);
18 
19         subject.notifyObservers("hello");
20     }
21 }

 

posted @ 2019-08-25 20:54  李白与酒  阅读(189)  评论(0编辑  收藏  举报