对这是我的昵称
2021-11-29 18:18
采纳率: 100%
浏览 30

关于设计模式的策略模式,我有一点疑惑

都说策略模式能够代替if-else,但是我觉得并不能,比如商品打折的问题
不用策略模式:

/**
     * 获取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;
        }
        return price;
    }


使用策略模式:

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

     double getVipPrice(double originPrice);
}

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


}

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

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

        //这里不还是需要判断用户是v1还是v2吗?
        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));

    }
}

到最后getVipPrice方法传参的时候不还是得判断用户是v1还是v2,判断完后再去实例化对应的类吗?那这样的话不还是需要if-else吗?那这样的话策略模式的意义是什么?这个地方我真的很疑惑

2条回答 默认 最新

相关推荐 更多相似问题