觀察者(Observer)模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時, 所有依賴于它的對象都得到通知并被自動更新。
適用性:
  • 當一個抽象模型有兩個方面, 其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和復用。
  • 當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變。
  • 當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之, 你不希望這些對象是緊密耦合的。

    Observer.bmp
    《Java與模式》中提到了兩種結構,上圖屬于第二種,Java中內置的Observable也屬于這種。
    一個簡單的例子:
    Subject抽象類:

    package?Observer;
    import?java.util.Vector;
    import?java.util.Enumeration;

    public?abstract?class?Subject{
    ????
    ????
    //聚集保存了對所有觀察者對象的引用
    ????private?Vector?obsVector?=new?Vector();
    ????
    //登記一個新的觀察者對象
    ????public?void?attach(Observer?obs){
    ????????obsVector.add(obs);
    ????}

    ????
    //刪除一個已經登記過的觀察者的對象
    ????public?void?detach(Observer?obs){
    ????????obsVector.remove(obs);
    ????}

    ????
    //通知所有已經登記過的觀察者對象
    ????public?void?notifyObservers(){
    ????????Enumeration?en
    =observers();
    ????????
    ????????
    while(en.hasMoreElements()){
    ????????????((Observer)en.nextElement()).update();
    ????????}
    ????
    ????}

    ????
    //返回觀察者聚集的Enumeration對象
    ????public?Enumeration?observers(){
    ????????
    return?obsVector.elements();
    ????}

    ????
    }

    具體Subject類
    package?Observer;
    public?class?ConcreteSubject?extends?Subject{
    ????
    //改變狀態
    ????public?void?change(){
    ????????
    this.notifyObservers();
    ????}

    }
    Observer類
    package?Observer;
    public?interface?Observer{
    ????
    //更新自己
    ????public?void?update();
    }
    ConcreteObserver類
    package?Observer;

    public?class?ConcreteObserver?implements?Observer{
    ????
    //調用此方法更新自己
    ????public?void?update(){
    ????????System.out.println(
    "I?am?nofitied");
    ????}

    }
    Client類
    package?Observer;

    public?class?Client{
    ????
    ????
    private?static?ConcreteSubject?subject;
    ????
    private?static?Observer?observer;
    ????
    ????
    public?static?void?main(String[]?args){
    ????????
    //創建主題對象
    ????????subject=new?ConcreteSubject();
    ????????
    //創建觀察者對象
    ????????observer=new?ConcreteObserver();
    ????????
    //登記觀察者對象
    ????????subject.attach(observer);
    ????????
    //改變狀態
    ????????subject.change();
    ????}

    }

    在JDK提供對觀察者模式的支持,利用java.util.Observable和java.util.Observer構造一個觀察者模式,在這里就不把一個示例代碼貼出來。

    參考資料:《設計模式速查手冊》
    ???????????????????? 《Java與模式》