設計模式 總目錄
https://preparedata.blog.csdn.net/article/details/134512591
文章目錄
- 設計模式 總目錄
- 一、案例
- 二、抽象類模版 AbstractOrderTemplate(頂層的訂單抽象類)
- 三、執行模版的實現類
- 3.1 默認執行模版 DefaultOrder
- 3.2 其他執行模版 SimlpeOrder
- 四、調用
一、案例
在的下單業務中,可以將下單邏輯拆分,可能存在檢驗參數、獲取商品、 扣減庫存、核銷優惠券、抵扣積分,保存訂單
等等。
應為業務的不同,可能下單處理節點不同(扣減庫存、核銷優惠券、抵扣積分,可能需要,可能不需要,也可能相互組合)。這是我們在單一下單接口中,邏輯就比較復雜,需要各種判斷,各種兼容,后續代碼邏輯很難清晰
這是我們可以借助模版模式,將下單邏輯,各個節點拆分,將具體各節點的執行進行模版組合,一個模版對應一套邏輯, 具體的下單邏輯,派發給模版去執行。
1.定義 抽象類 AbstractOrderTemplate
定義聲明拆分下單邏輯, 聲明模版執行; 通過業務類型來獲取模版;
2.定義 實現類 DefaultOrder (默認的執行模版)
、 SimlpeOrder (其他的執行模版)
繼承AbstractOrderTemplate, 實現抽象類AbstractOrderTemplate的模版執行。
通過模版可以自由區組合業務節點, 打包成一個執行整體。
二、抽象類模版 AbstractOrderTemplate(頂層的訂單抽象類)
package com.pd.shopping.order.designptern.template;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.util.Map;/*** @author hll*/
@Slf4j
@Component
public abstract class AbstractOrderTemplate {public static AbstractOrderTemplate getInstance(String orderType) {switch (orderType){case "Simlpe"://可以利用一些獲取Bean的工具獲取, 避免new//SpringApplicationUtil.getBean(SimlpeOrder.class);return new SimlpeOrder();case "Default":return new DefaultOrder();default:return new DefaultOrder();}}/*** 檢查參數* @param map*/public abstract void check(Map<String, Object> map);/*** 獲取商品* @param map*/public abstract void getGoods(Map<String, Object> map);/*** 扣減庫存* @param map*/public abstract void deductStock(Map<String,Object> map);/*** 扣減積分* @param map*/public abstract void deductPoint(Map<String,Object> map);/*** 保存訂單* @param map*/public abstract void saveOrder(Map<String,Object> map);/*** 執行模版* @param map*/public abstract void executeTemplate(Map<String,Object> map);
}
三、執行模版的實現類
3.1 默認執行模版 DefaultOrder
package com.pd.shopping.order.designptern.template;import java.util.Map;public class DefaultOrder extends AbstractOrderTemplate {@Overridepublic void check(Map<String, Object> map) {}@Overridepublic void getGoods(Map<String, Object> map) {}@Overridepublic void deductStock(Map<String, Object> map) {}@Overridepublic void deductPoint(Map<String, Object> map) {}@Overridepublic void saveOrder(Map<String, Object> map) {}@Overridepublic void executeTemplate(Map<String, Object> map) {//檢查參數check(map);//獲取商品getGoods(map);//扣減庫存deductStock(map);//扣減積分deductPoint(map);//保存訂單saveOrder(map);}
}
3.2 其他執行模版 SimlpeOrder
package com.pd.shopping.order.designptern.template;import java.util.Map;public class SimlpeOrder extends AbstractOrderTemplate {@Overridepublic void check(Map<String, Object> map) {}@Overridepublic void getGoods(Map<String, Object> map) {}@Overridepublic void deductStock(Map<String, Object> map) {}@Overridepublic void deductPoint(Map<String, Object> map) {}@Overridepublic void saveOrder(Map<String, Object> map) {}@Overridepublic void executeTemplate(Map<String, Object> map) {//檢查參數check(map);//獲取商品getGoods(map);//保存訂單saveOrder(map);}
}
四、調用
@GetMapping("/templateOrder")public void templateOrder() {AbstractOrderTemplate.getInstance("Simlpe").executeTemplate(new HashMap<>());AbstractOrderTemplate.getInstance("Default").executeTemplate(new HashMap<>());}