【設計模式】Java設計模式 - 觀察者模式
目錄?? 不斷學習才是王道
?? 繼續踏上學習之路,學之分享筆記
?? 總有一天我也能像各位大佬一樣
?? @一個有夢有戲的人 @怒放吧德德
??分享學習心得,歡迎指正,大家一起學習成長!
- 【設計模式】Java設計模式 - 觀察者模式
- 簡介
- 1、描述
- 2、實體
- ①、產品串列
- ②、觀察者
- ③、測驗
簡介
觀察者模式又叫發布-訂閱(Publish-Subscribe)模式,是物件的行為模式,訂閱是表示這些觀察者物件需要向目標物件進行注冊,這樣目標物件才知道有哪些物件在觀察它,發布指的是當目標物件的狀態改變時,它就向它所有的觀察者物件發布狀態更改的訊息,以讓這些觀察者物件知曉,定義物件間的一種一對多的依賴關系,當一個物件的狀態發生改變時,所有依賴于它的物件都得到通知并被自動更新,
就像數學函式那樣,設函式y=x2,y隨著x的增長而增長,我就稱x為自變數,y為因變數,
1、描述
在現實中,有些條件變化會帶著一些列的變化,這就需要用if,就比如電商,一家商家與許多平臺合作,每當有新產品的時候,就需要吧產品推送給各個平臺,當有其他平臺后來加入合作,那就需要在if中進行添加邏輯,這樣會導致代碼量變多,不便于維護,然而使用觀察者模式便于維護,也能夠擴展,
觀察者模式UML如圖:

2、實體
本次實驗通過定義產品串列作為被觀察物件,定義兩個觀察者觀察變化,在測驗中添加產品,使得被觀察物件向觀察者發送訊息,也就是發布-訂閱模式,
①、產品串列
觀察者模式是在觀察者和被觀察者雙方,觀察者可以是多個,在產品串列類中需要繼承java.util.Observable的方法,
- 構建方法私有化,采用單例模式,避免直接通過new的方式去實體化物件,而是通過getInstance方法去實體化物件,
- 可以通過addProductListObserver方法來添加一個觀察者,
- addProduct用來添加產品,并且通知觀察者
package com.lyd.demo.product;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* @Author: lyd
* @Description: 被觀察的產品物件
* @Date: 2022-08-20
*/
public class ProductList extends Observable {
private List<String> productList = null; // 產品串列
private static ProductList instance; // 唯一實體
private ProductList() {} // 構建方法私有化
/**
* 獲取唯一實體
* @return 實體
*/
public static ProductList getInstance() {
if (instance == null) {
instance = new ProductList();
instance.productList = new ArrayList<String>();
}
return instance;
}
/**
* 增加觀察者(電商介面)
* @param observable 觀察者
*/
public void addProductListObserver(Observer observable) {
this.addObserver(observable);
}
public void addProduct(String newProduct) {
productList.add(newProduct);
System.out.println("產品串列新增加了產品:" + newProduct);
this.setChanged(); // 設定被觀察物件發送變化
this.notifyObservers(newProduct); // 通知觀察者,并傳遞新產品
}
}
②、觀察者
構建兩個觀察者,簡單做個列印,觀察者需要實作java.util.Observer介面,并且實作update方法,
淘寶:
package com.lyd.demo.observer;
import java.util.Observable;
import java.util.Observer;
/**
* @Author: lyd
* @Description: 淘寶觀察者介面
* @Date: 2022-08-20
*/
public class TaoBaoObserver implements Observer {
public void update(Observable o, Object product) {
String newProduct = (String) product;
System.out.println("發送給新產品:" + newProduct + " 同步到淘寶商城");
}
}
京東:
package com.lyd.demo.observer;
import java.util.Observable;
import java.util.Observer;
/**
* @Author: lyd
* @Description: 京東觀察者介面
* @Date: 2022-08-20
*/
public class JingDongObserver implements Observer {
public void update(Observable o, Object product) {
String newProduct = (String) product;
System.out.println("發送給新產品:" + newProduct + " 同步到京東商城");
}
}
③、測驗
先添加觀察者,在添加產品,這樣就能看到被觀察者發布訊息給觀察者,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/504506.html
標籤:其他
