觀察者(Observer)模式

觀察者模式(Observer Pattern):定義對象間的一種一對多依賴關係,使得每當一個對象狀態發生改變時,其相關依賴對象皆得到通知並被自動更新。觀察者模式又叫做發佈-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。

觀察者模式

觀察者模式包含如下角色:

Subject: 目標
CSubject: 具體目標
Observer: 觀察者
CObserver: 具體觀察者

我的具體操作(JAVA):
0. CSubject類中維護了一個ArrayList。
1. Subject可以自由添加或刪除Observer。用addObserver()、和delObserver()方法。
2. 目標在發生變化時可以通知觀察者,用notify1Observer()方法。

//因爲已經有了notify()方法,所以我寫的方法命名爲notify1()
public interface Observer {
    void notify1(String str);
}

public interface Subject {
    void notify1Observer(String str);
    void addObserver(Observer ob);
    void delObserver(Observer ob);
}

public class CObserver implements Observer{
    String name;
    public CObserver(String str)
    {
        name = str;
    }

    @Override
    public void notify1(String str) {
        System.out.println(name + " notified " + str);
    }

}


import java.util.ArrayList;
public class CSubject implements Subject{

    String name;
    ArrayList<Observer> obList;

    public CSubject(String str)
    {
        name = str;
        obList = new ArrayList<>();
    }

    @Override
    public void addObserver(Observer ob) {
        obList.add(ob);
    }

    @Override
    public void delObserver(Observer ob) {
        obList.remove(ob);
    }

    @Override
    public void notify1Observer(String str) {
        for(Observer x:obList)
        {
            x.notify1(str);
        }
    }

}

public class TEST{
    public static void main(String[] args)
    {
        Subject sub1 = new CSubject("sub1");
        Observer ob1 = new CObserver("ob1");
        Observer ob2 = new CObserver("ob2");

        sub1.addObserver(ob1);
        sub1.addObserver(ob2);
        sub1.notify1Observer("event 1");

        System.out.println("-------------------");

        sub1.delObserver(ob2);
        sub1.notify1Observer("event 2");
    }
}

//結果如下:
//ob1 notified event 1
//ob2 notified event 1
//--------------
//ob1 notified event 2
觀察者模式描述瞭如何建立對象與對象之間的依賴關係,如何構造滿足這種需求的系統。
這一模式中的關鍵對象是觀察目標和觀察者,一個目標可以有任意數目的與之相依賴的觀察者,一旦目標的狀態發生改變,所有的觀察者都將得到通知。
作爲對這個通知的響應,每個觀察者都將即時更新自己的狀態,以與目標狀態同步,這種交互也稱爲發佈-訂閱(publishsubscribe)。目標是通知的發佈者,它發出通知時並不需要知道誰是它的觀察者,可以有任意數目的觀察者訂閱它並接收通知。

觀察者模式在軟件開發中應用非常廣泛,如某電子商務網站可以在執行發送操作後給用戶多個發送商品打折信息,某團隊戰鬥遊戲中某隊友犧牲將給所有成員提示等等,凡是涉及到一對一或者一對多的對象交互場景都可以使用觀察者模式。

總結:

觀察者模式定義對象間的一種一對多依賴關係,使得每當一個對象狀態發生改變時,其相關依賴對象皆得到通知並被自動更新。觀察者模式又叫做發佈-訂閱模式、模型-視圖模式、源-監聽器模式或從屬者模式。觀察者模式是一種對象行爲型模式。
觀察者模式包含四個角色:目標又稱爲主題,它是指被觀察的對象;具體目標是目標類的子類,通常它包含有經常發生改變的數據,當它的狀態發生改變時,向它的各個觀察者發出通知;觀察者將對觀察目標的改變做出反應;在具體觀察者中維護一個指向具體目標對象的引用,它存儲具體觀察者的有關狀態,這些狀態需要和具體目標的狀態保持一致。
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個目標對象,當這個目標對象的狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新。
觀察者模式的主要優點在於可以實現表示層和數據邏輯層的分離,並在觀察目標和觀察者之間建立一個抽象的耦合,支持廣播通信;其主要缺點在於如果一個觀察目標對象有很多直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間,而且如果在觀察者和觀察目標之間有循環依賴的話,觀察目標會觸發它們之間進行循環調用,可能導致系統崩潰。
觀察者模式適用情況包括:一個抽象模型有兩個方面,其中一個方面依賴於另一個方面;一個對象的改變將導致其他一個或多個對象也發生改變,而不知道具體有多少對象將發生改變;一個對象必須通知其他對象,而並不知道這些對象是誰;需要在系統中創建一個觸發鏈。
在JDK的java.util包中,提供了Observable類以及Observer接口,它們構成了Java語言對觀察者模式的支持。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章