Java設計模式之觀察者模式

代碼結構:java

 

 

概念:ide

觀察者模式要同時存在觀察者和被觀察者雙方,觀察者能夠是多個。在Java中,須要去繼承java.util.Observable類,先看被觀察者(一個產品列表),以下代碼:測試

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
 * 被觀察的產品列表
 * @author Administrator
 *
 */
public class ProductList extends Observable {
    private List<String> producList = null;// 產品列表
    private static ProductList instance;// 類的惟一實例

    private ProductList() {// 私有構造器

    }

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

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

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

上面這個類的一些基本內容和主要方法以下:this

一、構造方法私有化,避免經過new的方式建立對象,而是經過getInstance方法獲取產品列表清單,這裏使用的是單例模式。spa

二、addProducListObserver能夠增長一個電商接口(觀察者)。3d

三、核心邏輯在addProduct方法上。在產品列表上增長了一個新的產品,而後調用setChanged方法。這個方法用於告知觀察者當前被觀察者發生了變化,若是沒有,則沒法觸發其行爲。最後經過notifyObservers告知觀察者,讓他們發生相應的動做,並將新產品做爲參數傳遞給觀察者。code

這時已經有了被觀察者對象,還要去編寫觀察者。以淘寶和京東威力,去實現他們的電商接口。做爲觀察者須要實現java.util.Observer接口的update方法,以下所示:server

import java.util.Observable;
import java.util.Observer;
/**
 * 京東電商接口
 * @author Administrator
 *
 */
public class JingDongObserver implements Observer{

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

}
import java.util.Observable;
import java.util.Observer;
/**
 * 淘寶電商接口
 * @author Administrator
 *
 */
public class TaoBaoObserver implements Observer{
    
    @Override
    public void update(Observable o, Object product) {
        String newProduct = (String) product;
        System.out.println("發送新產品["+newProduct+"]同步到淘寶商城");
    }

}

建立測試類這兩個觀察者和產品列表的被觀察者,代碼以下:對象

public class Test {
    public static void main(String[] args) {
        ProductList observable = ProductList.getInstance();
        TaoBaoObserver taoBaoObserver = new TaoBaoObserver();
        JingDongObserver jingDongObserver = new JingDongObserver();
        observable.addObserver(taoBaoObserver);
        observable.addObserver(jingDongObserver);
        observable.addProduct("新增產品1");
    }
}

增長橫線的代碼是對被觀察者註冊觀察者,這樣才能讓觀察者監控到被觀察者的變化狀況,運行上面代碼獲得以下結果:blog

產品列表新增了產品:新增產品1
發送新產品[新增產品1]同步到京東商城
發送新產品[新增產品1]同步到淘寶商城

結論:之後在產品列表發佈新產品,觀察者們均可以觸發對應的行爲了,就不會出現if語句的各種問題,更利於擴展和維護。

相關文章
相關標籤/搜索