1. 程式人生 > >Java設計模式學習筆記(觀察者模式)

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了。