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

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

都说策略模式能够代替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条回答 默认 最新

  • 未聞花名丶 2021-12-01 22:44
    关注

    一般结合工厂模式去做

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月1日
  • 已采纳回答 12月24日
  • 创建了问题 11月29日

悬赏问题

  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择
  • ¥15 这款软件是什么?需要能满足我的需求
  • ¥15 SpringSecurityOauth2登陆前后request不一致