觀察者模式Observer -- 深入理解

一、what is 觀察者模式?

觀察者模式又稱爲發佈訂閱模式,它定義了一種一對多的依賴關係,一個被觀察者對象會被多個觀察者同時監視,當被觀察者的狀態發生改變,會通知所有觀察者,並讓其作出相應動作。

這種關係和數學裏面的函數類似:比如y=2x,當x=1,y=2;x=2,y=4.....;x是自變量,y是因變量。x就對應被觀察者,y就對應觀察者(這時只有一個觀察者,實際生活中或者開發中是多個)。

二、觀察者模式實例

考慮這樣的場景:一個賣化妝品的公司,它銷售渠道主要靠線上銷售,已經加盟淘寶、京東、拼多多、蘇寧、唯品會等多家電商平臺,只要有新的產品生產出來了,公司會更新產品列表,然後會分別在各個電商平臺進行銷售。這就符合了觀察者模式的定義:公司的產品列表就是被觀察者,各電商平臺就是觀察者,只要公司的產品列表更新了,各電商平臺也要同步售賣:

被觀察者:

public class ProductList extends Observable {
    // 產品列表
    private List<String> productList = null;
    // 單例模式,唯一實例
    private static ProductList instance;

    private ProductList() {}

    // 獲取唯一實例
    public static ProductList getInstance() {
        if (instance == null) {
            instance = new ProductList();
            instance.productList = new ArrayList<>();
        }
        return instance;
    }

    // 電商入駐(新增觀察者)
    public void addObservers(Observer observer){
        // 這裏的addObserver()方法是繼承於Observable類
        this.addObserver(observer);
    }

    // 新增產品
    public void addProduct(String newProduct){
        productList.add(newProduct);
        System.out.println("【產品列表更新】新增" + newProduct + "產品!");
        // 設置被觀察者狀態變化
        this.setChanged();
        // 通知觀察者
        this.notifyObservers(newProduct);
    }

}

觀察者1:

public class TaobaoObserver implements Observer {
    @Override
    public void update(Observable o, Object product) {
       String newProduct = (String) product;
       System.out.println("淘寶更新產品: " + newProduct);
    }
}

觀察者2:

public class JingDongObserver implements Observer {
    @Override
    public void update(Observable o, Object product) {
       String newProduct = (String) product;
       System.out.println("京東更新產品: " + newProduct);
    }
}

測試類:

public class MainTest {
    public static void main(String[] args) {
        ProductList productList = ProductList.getInstance();
        TaobaoObserver taobaoObserver = new TaobaoObserver();
        JingDongObserver jingDongObserver = new JingDongObserver();
        productList.addObservers(taobaoObserver);
        productList.addObservers(jingDongObserver);
        productList.addProduct("面膜");
    }
}
​
【產品列表更新】新增面膜產品!
京東更新產品: 面膜
淘寶更新產品: 面膜
​

通過代碼展示,觀察者的好處就出來了:只要被觀察者有新產品發佈,所有觀察者都會觸發對應的行爲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章