观察者设计模式(订阅/发布模式)是非常常见也是很有意思的一种设计模式,可以理解为是一种回调。
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
定义了一种一对多的依赖关系,当一个对象(被观察者Observable)的状态发生改变后,多个依赖对象(观察者Observer)被通知并自动发生变化。
观察者模式的类图:

观察者模式的关键是被观察者中具有一个属性,一般为List<Observer>,保存着当前的观察者,而每当被观察者的属性发生变化时,便会去通知观察者(同步或异步,调用观察者的update接口),所有观察者只要继承自Observer接口即可。
令人欣喜的是,如同迭代器设计模式一样,观察者模式实际也已经被继承在了JDK中。jdk中的java.util.Observer和java.util.Observable类中,我们在实现自己的观察者模式时,只要去继承相应的类即可。
以下的例子摘自wiki:
监控控制台用户的输入,当有输入时观察者进行相应,
import java.util.Observable;
import java.util.Scanner;
class EventSource extends Observable implements Runnable {
public void run() {
while (true) {
String response = new Scanner(System.in).next();
setChanged();
notifyObservers(response);
}
}
}
import java.util.Observable;
import java.util.Observer;
public class MyApp {
public static void main(String[] args) {
System.out.println("Enter Text: ");
EventSource eventSource = new EventSource();
eventSource.addObserver(new Observer() {
public void update(Observable obj, Object arg) {
System.out.println("Received response: " + arg);
}
});
new Thread(eventSource).start();
}
}
网友评论