对这是我的昵称 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 CARSIM前车变道设置
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败