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");
}
}