代碼結構: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語句的各種問題,更利於擴展和維護。