觀察者設計模式(訂閱/發(fā)布模式)是非常常見也是很有意思的一種設計模式,可以理解為是一種回調(diào)。
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
定義了一種一對多的依賴關系,當一個對象(被觀察者Observable)的狀態(tài)發(fā)生改變后,多個依賴對象(觀察者Observer)被通知并自動發(fā)生變化。
觀察者模式的類圖:

Observer
觀察者模式的關鍵是被觀察者中具有一個屬性,一般為List<Observer>,保存著當前的觀察者,而每當被觀察者的屬性發(fā)生變化時,便會去通知觀察者(同步或異步,調(diào)用觀察者的update接口),所有觀察者只要繼承自Observer接口即可。
令人欣喜的是,如同迭代器設計模式一樣,觀察者模式實際也已經(jīng)被繼承在了JDK中。jdk中的java.util.Observer和java.util.Observable類中,我們在實現(xiàn)自己的觀察者模式時,只要去繼承相應的類即可。
以下的例子摘自wiki:
監(jiān)控控制臺用戶的輸入,當有輸入時觀察者進行相應,
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();
}
}