跟著柴毛毛學Spring(1)——縱觀Spring
阿新 • • 發佈:2022-05-03
1.策略模式簡介
1.策略模式是⼀種⾏為模式,也是替代⼤量 ifelse 的利器。
2.應用場景:具有同類可替代的⾏為邏輯演算法場景2.1 不同型別的交易⽅式(信⽤卡、⽀付寶、微信)
2.2 不同的抽獎策略(必中抽獎概率方式、單項抽獎方式)
2.案例場景
我們模擬在購買商品時候使⽤的各種型別優惠券(滿減、直減、折扣、n元購)
3.普通程式碼實現
以下程式碼在CouponDiscountService.java
中
public class CouponDiscountService { public double discountAmount(int type, double typeContent, double skuPrice, double typeExt) { // 1. 直減券 if (1 == type) { return skuPrice - typeContent; } // 2. 滿減券 if (2 == type) { if (skuPrice < typeExt) return skuPrice; return skuPrice - typeContent; } // 3. 折扣券 if (3 == type) { return skuPrice * typeContent; } // 4. n元購 if (4 == type) { return typeContent; } return 0D; } }
分析
1.不同的優惠券型別可能需要不同的入口引數,比如直減券不需要知道商品金額,滿減券需要知道商品金額,造成了入口引數的增加,不能由入口引數去判斷某種優惠券需要哪些條件。
2.隨著產品功能的增加,需要不斷擴充套件if語句,程式碼可讀性差。
4.策略模式結構模型
4.1 工程結構
4.2 策略模式結構分析
1.定義了優惠券介面,增加了泛型用於不同型別的介面傳遞不同的型別引數。
public interface ICouponDiscount<T> { /** * 優惠券⾦額計算 * @param couponInfo 券折扣資訊;直減、滿減、折扣、N元購 * @param skuPrice sku⾦額 * @return 優惠後⾦額 */ BigDecimal discountAmount(T couponInfo, BigDecimal skuPrice); }
2.具體的優惠券行為去實現優惠券介面類,實現自己的優惠券策略。
3.增加了策略控制類Context,使外部通過統一的方法執行不同的優惠策略計算。
public class Context<T> { private ICouponDiscount<T> couponDiscount; public Context(ICouponDiscount<T> couponDiscount) { this.couponDiscount = couponDiscount; } public BigDecimal discountAmount(T couponInfo, BigDecimal skuPrice) { return couponDiscount.discountAmount(couponInfo, skuPrice); } }