1. 定义
定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
2. 结构图
Subject:目标对象,通常具有如下功能。
一个目标可以被多个观察者观察。
目标提供对观察者注册和退订的维护。
当目标的状态发生变化时,目标负责通知所有注册的、有效的观察者。
Observer:定义观察者的接口,提供目标通知时对应的更新方法,这个更新方法进行相应的业务处理,可以在这个方法里面回调目标对象,以获取目标对象的数据。
ConcreteSubject:具体的目标实现对象,用来维护目标状态,当目标对象的状态发生改变时,通知所有注册的、有效的观察者,让观察者执行相应的处理。
ConcreteObserver:观察者的具体实现对象,用来接收目标的通知,并进行相应的后续处理,比如更新自身的状态以保持和目标的相应状态一致。
3. 本质
观察者模式的本质:触发联动。
4. Code Demo
Subject.java
package org.fool.observer; public interface Subject { public void addWatcher(Watcher watcher); public void removeWatcher(Watcher watcher); public void notifyWatchers(String str); }
ConcreteSubject.java
package org.fool.observer; import java.util.ArrayList; import java.util.List; public class ConcreteSubject implements Subject { private List<Watcher> list = new ArrayList<>(); @Override public void addWatcher(Watcher watcher) { list.add(watcher); } @Override public void removeWatcher(Watcher watcher) { list.remove(watcher); } @Override public void notifyWatchers(String str) { for (Watcher watcher : list) { watcher.update(str); } } }
Watcher.java
package org.fool.observer; public interface Watcher { public void update(String str); }
ConcreteWatcher.java
package org.fool.observer; public class ConcreteWatcher implements Watcher { @Override public void update(String str) { System.out.println(str); } }
Test.java
package org.fool.observer; public class Test { public static void main(String[] args) { Subject subject = new ConcreteSubject(); Watcher watcher1 = new ConcreteWatcher(); Watcher watcher2 = new ConcreteWatcher(); Watcher watcher3 = new ConcreteWatcher(); subject.addWatcher(watcher1); subject.addWatcher(watcher2); subject.addWatcher(watcher3); subject.notifyWatchers("got 3 tickets"); subject.removeWatcher(watcher2); subject.notifyWatchers("got 2 tickets, hurry"); } }