營銷項目策略+模板方法+工廠運用

在之前做的營銷項目中,優(yōu)惠券有滿減券和折扣券類型(后面會增加類型),這兩種類型的計算規(guī)則是不一樣的,滿減是用減法,折扣是用%。如果用if(滿減){}else if(折扣){}來處理,那么就顯得很low
這種場景使用了策略+模板方法+工廠。策略就是替代了 if else ,模板方法是將滿減券和折扣券都需要用到的邏輯寫到抽象父類上讓這兩種類型繼承,就可以復用方法,工廠主要是通過spring的ioc注入來實現(xiàn)。
直接代碼展示

首先定義優(yōu)惠券計算的接口

public interface ICouponCalculate {
    /**
     * 優(yōu)惠計算方法定義
     */
    CalculateResultDTO calculate(RulesExecuteReqDTO rulesExecuteReqDTO);

    /**
     * 計算規(guī)則對應的枚舉
     *
     * @return
     */
    MarketingTypeEnum calculateType();

  // 這里主要是當獲取不到對應優(yōu)惠券類型的策略類,就默認獲取這個類來報錯提示
    ICouponCalculate DEFAULT_IMPLEMENT = new ICouponCalculate() {

        @Override
        public CalculateResultDTO calculate(RulesExecuteReqDTO rulesExecuteReqDTO) {
            throw new UnsupportedOperationException();
        }

        @Override
        public MarketingTypeEnum calculateType() {
            throw new UnsupportedOperationException();
        }
    };

}

然后定義策略類的優(yōu)惠券計算的抽象父類 實現(xiàn)優(yōu)惠券計算的接口

public abstract class CouponCalculateAbstract implements ICouponCalculate {
    public final static double PERCENT = 0.01;

    public final static double MIN_KHR = 1;
    public final static double MIN_USD = 0.01;
// 美元的優(yōu)惠金額必須滿0.01元,不然不能使用這張優(yōu)惠券,HKR必需滿1元
// 這個方法滿減券和折扣券都需要用到,所以寫到父類上
    protected boolean isDiscount(CurrencyTypeEnum currencyType, int calculateKHR, double calculateUSD) {
        if (currencyType.equals(CurrencyTypeEnum.KHR)) {
            if (calculateKHR < MIN_KHR) {
                // KHR少于1元,不返現(xiàn)
                log.info("KHR優(yōu)惠金額小于1");
                return false;
            }
        }
        if (currencyType.equals(CurrencyTypeEnum.USD)) {
            if (calculateUSD < MIN_USD) {
                // USD少于0.01元,不返現(xiàn)
                log.info("USD優(yōu)惠金額小于0.01");
                return false;
            }
        }
        return true;
    }

然后寫具體類型的策略類,繼承抽象父類
滿減策略類

@Component
public class FullCouponCalculateStrategy extends CouponCalculateAbstract {
    @Override
    public CalculateResultDTO calculate(RulesExecuteReqDTO rulesExecuteReqDTO) {
        log.info("滿減優(yōu)惠券計算");
      ......
        return calculateResultDTO;
    }
    @Override
    public MarketingTypeEnum calculateType() {
        return MarketingTypeEnum.FULL_COUPON;
    }
}

折扣策略類

@Component
public class DiscountCouponCalculateStrategy extends CouponCalculateAbstract {
    @Override
    public CalculateResultDTO calculate(RulesExecuteReqDTO rulesExecuteReqDTO) {
        log.info("折扣優(yōu)惠券計算");
       業(yè)務代碼省略......
        return calculateResultDTO;
    }

    @Override
    public MarketingTypeEnum calculateType() {
        return MarketingTypeEnum.DISCOUNT_COUPON;
    }
}

運行策略的Context類,首先通過構造方法IOC注入方式獲取到所有的優(yōu)惠券計算實現(xiàn)類,然后封裝map中 key對應類型的枚舉,value為具體實現(xiàn)類。這個map相當于策略類的工廠

@Component
public class CouponCalculateStrategyContext {
    // 定義map,優(yōu)惠券類型對應計算類
    Map<MarketingTypeEnum, ICouponCalculate> calculateMap = new EnumMap<>(MarketingTypeEnum.class);

    // 初始化calculateMap,將對應的關系存到calculateMap中
    @Autowired
    public CouponCalculateStrategyContext(final Map<String, ICouponCalculate> instanceMap) {
        // 將Map<String, ICalculate> calculateInstance傳成對應計算規(guī)則的枚舉Map<RegisteredCashBackTypeEnum, ICalculate>
        Map<MarketingTypeEnum, ICouponCalculate> collect = instanceMap.values().stream()
                .filter(iCouponCalculate -> iCouponCalculate.calculateType() != null)
                .collect(Collectors.toMap(ICouponCalculate::calculateType, iCouponCalculate -> iCouponCalculate));
        calculateMap.putAll(collect);
    }

    // 執(zhí)行策略方法
    public CalculateResultDTO doCouponCalculate(MarketingTypeEnum marketingType, RulesExecuteReqDTO rulesExecuteReqDTO) {
        ICouponCalculate couponCalculate = calculateMap.getOrDefault(marketingType, DEFAULT_IMPLEMENT);
        return couponCalculate.calculate(rulesExecuteReqDTO);
    }

}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 寫在前面: 最近工作壓力不小,不想輸?shù)煤軕K就必須自己push自己。繼續(xù)鉆研促銷系統(tǒng)設計 不定期摘讀一些對自己有用的...
    Heenor閱讀 5,047評論 2 11
  • 幫朋友轉發(fā)。 上寧健康雙十一限時折扣,誠招代理.“解卡—菊粉”一款絕對綠色的健康食品,讓健康伴您腸在![勾引][勾...
    萌妹紙d霸氣范er閱讀 209評論 0 0
  • 陽光明媚的日子, 是我們所期待的, 別讓任何人影響到你的內心, 而讓...
    hzk思柚閱讀 207評論 0 0
  • 早晨醒來,揉揉雙眼盡力睜開 又得為一日三餐思慮 又得為一天生計奔忙 連軸的日子,如同拉磨的牛 蒙上雙眼循環(huán)不停 喜...
    瀚海戲墨閱讀 233評論 0 4

友情鏈接更多精彩內容