原创转载请注明出处: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 }