1. 程式人生 > 其它 >跟著柴毛毛學Spring(1)——縱觀Spring

跟著柴毛毛學Spring(1)——縱觀Spring

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);
 }
}