一、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("面膜");
}
}
【產品列表更新】新增面膜產品!
京東更新產品: 面膜
淘寶更新產品: 面膜
通過代碼展示,觀察者的好處就出來了:只要被觀察者有新產品發佈,所有觀察者都會觸發對應的行爲。