策略模式

策略模式的優點:

  • 策略模式符合開閉原則
  • 策略模式可避免使用多重條件語句
  • 使用策略模式可以提高算法的保密性和安全性

策略模式的缺點:

  • 客戶端必須知道所有的策略,並且自行決定使用哪一個策略類
  • 代碼中會產生很多的策略類,增加代碼的維護難度

用策略模式實現業務場景

大家都知道,平時我們購買東西經常會有優惠,優惠策略有很多種,如優惠券抵扣、返現促銷、拼團。

接下來就模擬這個場景,首先創建一個策略接口 PromotionStrategy

/**
 * @Author Lxq
 * @Date 2020/3/24 15:51
 * @Version 1.0
 * 促銷策略接口類
 */
public interface PromotionStrategy {
    void doPromotion();
}

然後就分別創建優惠券抵扣策略類 CouponStratepy、返現促銷策略類 CashbackStrategy、拼團策略類 GroupbuyStratepy、和無優惠策略類 EmptyStratepy

/**
 * @Author Lxq
 * @Date 2020/3/24 15:55
 * @Version 1.0
 * 優惠券
 */
public class CouponStratepy implements PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("領取優惠券,課程的價格直接減優惠券面值抵扣!");
    }
}
/**
 * @Author Lxq
 * @Date 2020/3/24 16:29
 * @Version 1.0
 * 返現促銷
 */
public class CashbackStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("返現促銷,返回現金到支付寶!");
    }
}

/**
 * @Author Lxq
 * @Date 2020/3/24 16:09
 * @Version 1.0
 * 拼團
 */
public class GroupbuyStratepy implements PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("拼團,滿20人成團,全團享受優惠!");
    }
}
/**
 * @Author Lxq
 * @Date 2020/3/24 16:36
 * @Version 1.0
 * 無促銷活動
 */
public class EmptyStratepy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("沒有促銷活動!");
    }
}

創建促銷活動方案類:PromotionActivity

/**
 * @Author Lxq
 * @Date 2020/3/24 16:11
 * @Version 1.0
 * 促銷活動方案類
 *
 */
public class PromotionActivity {

    private PromotionStrategy promotionStrategy;

    public PromotionActivity(PromotionStrategy promotionStrategy) {
        this.promotionStrategy = promotionStrategy;
    }

    public void excute(){
        promotionStrategy.doPromotion();
    }

}

創建一個促銷工廠類 PromotionStrategyFactory

/**
 * @Author Lxq
 * @Date 2020/3/24 16:26
 * @Version 1.0
 * 促銷工廠類
 */
public class PromotionStrategyFactory {

    private static Map<String, PromotionStrategy> PROMTION_STRATEGY_MAP = new HashMap<>();

    static {
        PROMTION_STRATEGY_MAP.put(PromotionKey.COUPON, new CouponStratepy());
        PROMTION_STRATEGY_MAP.put(PromotionKey.CASHBACK, new CashbackStrategy());
        PROMTION_STRATEGY_MAP.put(PromotionKey.GROUPBUY, new GroupbuyStratepy());
    }

    private static final PromotionStrategy NON_PROMOTION = new EmptyStratepy();

    public PromotionStrategyFactory() {
    }

    public static PromotionStrategy getPromotionStrategy(String promotionkey){
        PromotionStrategy promotionStrategy = PROMTION_STRATEGY_MAP.get(promotionkey);
        return promotionStrategy == null ? NON_PROMOTION : promotionStrategy;
    }
}

還有我們策略key的接口類:PromotionKey

/**
 * @Author Lxq
 * @Date 2020/3/24 16:31
 * @Version 1.0
 */
public interface PromotionKey {
    // 優惠券
    String COUPON = "COUPON";
    // 返現金
    String CASHBACK = "CASHBACK";
    // 拼團優惠
    String GROUPBUY = "GROUPBUY";

}

 

最後採用一種策略測試一下:

/**
 * @Author Lxq
 * @Date 2020/3/24 16:17
 * @Version 1.0
 */
public class Test {
    public static void main(String[] args) {
        String promotionKey = "GROUPBUY";
        PromotionActivity promotionActivity = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
        promotionActivity.excute();

    }
}

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章