最簡單的策略模式代替if-else實戰


一、需求

  根據用戶vip等級來返回不同的價格,vip等級是不固定的,隨時可能要增加,價格也不是固定的。

二、常規的寫法

/**
 * 如果有新增類型,就需要頻繁的修改此處的代碼!
 * 不符合開閉原則!
 * @author DUCHONG
 *
 */
public class CommonGetPrice {

    public static final String VIP1="v1";
    public static final String VIP2="v2";
    public static final String VIP3="v3";
    public static final String VIP4="v4";

    /**
     * 獲取vip的價格
     * @param type vip類型
     * @param price 原價格
     * @return
     */
    public static double getVipPrice(String type, double price) {

        if (type.equals(VIP1)) {
            System.out.println("不使用策略模式---不打折,原價");
            return price;
        }
        else if (type.equals(VIP2)) {
            System.out.println("不使用策略模式---打九折");
            return price * 0.9;
        }
        else if (type.equals(VIP3)) {
            System.out.println("不使用策略模式---打八五折");
            return price * 0.85;
        }
        else if (type.equals(VIP4)) {
            System.out.println("不使用策略模式---打八折");
            return price * 0.8;
        }
        return price;
    }

}

三、使用策略模式

3.1、定義策略接口

/**
 * 策略接口
 * @author DUCHONG
 */
public interface Strategy {

     double getVipPrice(double originPrice);
}

3.2、定義上下文

  上下文持有策略接口的引用,將算法與調用者隔離。

/**
 * 負責和具體的策略類交互
 * 這樣的話,具體的算法和直接的客戶端調用分離了,使得算法可以獨立於客戶端獨立的變化。
 * 如果使用spring的依賴注入功能,還可以通過配置文件,動態的注入不同策略對象,動態的切換不同的算法.
 * @author DUCHONG
 *
 */
public class VipContext {

    /**
     * 當前采用的算法對象
     */
    private Strategy strategy;

    public VipContext() {

    }
    /**
     * 可以通過構造器來注入
     */
    public VipContext(Strategy strategy) {
        super();
        this.strategy = strategy;
    }
    /**
     * 可以通過set方法來注入
     */
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public double getVipPrice(double originPrice){
        return strategy.getVipPrice(originPrice);
    }


}

3.3、不同算法實現類

/**
 * @author DUCHONG
 * @since 2019-09-24 18:28
 **/
public class VipOneStrategy implements Strategy {

    /**
     * vip1 不打折
     * @param originPrice
     * @return
     */
    @Override
    public double getVipPrice(double originPrice) {

        System.out.println("使用策略模式---不打折,原價");
        return originPrice;
    }
}

/**
 * @author DUCHONG
 * @since 2019-09-24 18:28
 **/
public class VipTwoStrategy implements Strategy{

    @Override
    public double getVipPrice(double originPrice) {
        System.out.println("使用策略模式---打九折");
        return originPrice * 0.9;
    }
}

/**
 * @author DUCHONG
 * @since 2019-09-24 18:28
 **/
public class VipThreeStrategy implements Strategy{

    @Override
    public double getVipPrice(double originPrice) {
        System.out.println("使用策略模式---打八五折");
        return originPrice * 0.85;
    }
}

/**
 * @author DUCHONG
 * @since 2019-09-24 18:28
 **/
public class VipFourStrategy implements Strategy{

    @Override
    public double getVipPrice(double originPrice) {
        System.out.println("使用策略模式---打八折");
        return originPrice * 0.8;
    }
}

四、Client

public class Client {


    public static void main(String[] args) {

        double originPrice=1000D;

        //使用策略模式之前
        System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP1,originPrice));
        System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP2,originPrice));
        System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP3,originPrice));
        System.out.println(CommonGetPrice.getVipPrice(CommonGetPrice.VIP4,originPrice));


        //使用策略模式之后
        VipContext vipContext=new VipContext();

        Strategy v1=new VipOneStrategy();
        vipContext.setStrategy(v1);
        System.out.println(vipContext.getVipPrice(originPrice));

        Strategy v2=new VipTwoStrategy();
        vipContext.setStrategy(v2);
        System.out.println(vipContext.getVipPrice(originPrice));

        Strategy v3=new VipThreeStrategy();
        vipContext.setStrategy(v3);
        System.out.println(vipContext.getVipPrice(originPrice));

        Strategy v4=new VipFourStrategy();
        vipContext.setStrategy(v4);
        System.out.println(vipContext.getVipPrice(originPrice));

    }
}

五、結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM