都说策略模式能够代替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吗?那这样的话策略模式的意义是什么?这个地方我真的很疑惑