最简单的策略模式代替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));

    }
}

五、结果

猜你喜欢

转载自www.cnblogs.com/geekdc/p/11580219.html