Java設計模式學習筆記(觀察者模式)
觀察者模式說起來很簡單,就是一個訂報紙的模式。但是實際上這部分我覺得還是很有意思的,《Head First設計模式》裡還有一些還沒看完,也是因為理解的不夠深吧。
觀察者模式會包含兩個元件:觀察者和主題。
這段程式碼是主題的介面:
package obeserver;
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObserver();
}
下面是觀察者的介面:
package obeserver;
public interface Observer {
public void update(String str);
}
然後就是具體的主題實現:
package obeserver;
import java.util.ArrayList;
import java.util.List;
public class concreteSubject implements Subject {
List<Observer> list = new ArrayList<Observer>();
@Override
public void registerObserver(Observer observer) {
// TODO Auto-generated method stub
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
// TODO Auto-generated method stub
list.remove(observer);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for (Observer o : list) {
o.update("Hello, World!");
}
}
}
下面的程式碼是具體的觀察者實現:
package obeserver;
public class concreteObserver implements Observer {
@Override
public void update(String str) {
// TODO Auto-generated method stub
System.out.println(str);
}
}
下面寫一段測試程式碼看看:
package obeserver;
public class observerTest {
public static void main(String[] args) {
Subject s1 = new concreteSubject();
Observer o1 = new concreteObserver();
Observer o2 = new concreteObserver();
Observer o3 = new concreteObserver();
s1.registerObserver(o1);
s1.registerObserver(o2);
s1.registerObserver(o3);
s1.notifyObserver();
}
}
這段測試程式碼會輸出三行的“Hello, World!”。
其實我覺得這裡的update方法寫Hello,world是不能說明問題的。其實這個方法裡應該是更新觀察者的其他一些狀態的,比如書裡寫的氣象站的一些資料(氣溫,溼度等),這樣才叫做update。
總結一下,觀察者模式其實和訂報紙很像,報社(主題)維護著訂閱方法和取消訂閱方法,同時也維護著送報紙的方法。而訂報紙的人(觀察者)接收到報紙之後,看報了就能瞭解新聞,增廣見聞,這就是update了。