2020 Java設計模式 - 觀察者模式

3 觀察者模式

  觀察者模式又稱發佈訂閱模式,是對象的行爲模式。觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽着被觀察者的狀態,當被觀察者的狀態發送變化時,會通知所有觀察者,並讓其自動更新自己。
  觀察者模式要同時存在觀察者和被觀察者雙方,觀察者可以是多個。在Java中,需要繼承java.util.Observable類。
被觀察者的產品列表:

package com.feike.observer;

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

/**
 * @ProjectName: chapter2
 * @Package: com.feike.observer
 * @ClassName: ProductList
 * @author: Feike
 * @description:
 * @date: 2020/6/28 21:33
 * @version: 1.0
 */
public class ProductList extends Observable {
    /**
     * 產品列表
     */
    private List<String> productList = null;
    /**
     * 類唯一實例
     */
    private static ProductList instance;

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

    /**
     * 增加觀察者(電商接口)
     * @param observer 觀察者
     */
    public void addProductListObserver(Observer observer){
        this.addObserver(observer);
    }

    public void addProduct(String newProduct){
        productList.add(newProduct);
        System.out.println("產品列表新增了產品:" + newProduct);
        //設置被觀察者發生了變化
        this.setChanged();
        //通知觀察者,並傳遞新產品
        this.notifyObservers(newProduct);
    }

}
  • 構建方法私有化,避免通過new的方式創建對象,而是通過getInstance方法獲得產品列表單例,這裏使用的是單例模式。
  • addProductListObserver 可以增加一個電商接口(觀察者)
  • 核心邏輯在addProduct方法上。在產品列表上增加了一個新的產品,然後調用setChanged方法。這個方法用於告知觀察者放生了變化,如果沒有,則無法觸發其行爲。最後通過notifyObserve告知觀察者,讓它們發生相應的動作,並將新產品作爲參數傳遞給觀察者。

京東電商接口:

public class JingDongObserver implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        String newProduct = (String) arg;
        System.out.println("發送新產品【" + newProduct+ "】同步到京東商城!");
    }
}

淘寶電商接口:

public class TaobaoObserver implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        String newProduct = (String) arg;
        System.out.println("發送新產品【"+newProduct+"】同步到淘寶商城");
    }
}

測試觀察者模式:

    @Test
    public void test(){
        ProductList observable = ProductList.getInstance();
        TaobaoObserver taobaoObserver = new TaobaoObserver();
        JingDongObserver jingDongObserver = new JingDongObserver();
        observable.addObserver(jingDongObserver);
        observable.addObserver(taobaoObserver);
        observable.addProduct("鼠標");
    }

測試結果:

產品列表新增了產品:鼠標
發送新產品【鼠標】同步到淘寶商城
發送新產品【鼠標】同步到京東商城!

工廠模式和抽象工廠模式

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