- 什么是策略模式?
策略模式,说白了,就是将一系列算法封装进策略类的子类里,根据不同的需求,执行不同的算法
举个栗子;电商业务中,会员结算价格时,需要根据会员等级,返给用户不同的积分,或者满多少打折,这个时候就可以使用策略模式来代替传统的多层嵌套if
普通注册用户:不减
vip1:减2元
vip2:减4元
vip3:减6元
代码实现
定义策略接口
public interface Strategy {
/**
* 价格计算
* @param payMoney
* @return
*/
BigDecimal payMoney(BigDecimal payMoney);
}
vip0策略
@Component(value = "strategyVipZero")
public class StrategyVipZero implements Strategy {
@Override
public BigDecimal payMoney(BigDecimal payMoney) {
return payMoney;
}
}
vip1策略
@Component(value = "strategyVipOne")
public class StrategyVipOne implements Strategy {
@Override
public BigDecimal payMoney(BigDecimal payMoney) {
// 减2元
return payMoney.subtract(new BigDecimal(2));
}
}
vip2策略
@Component(value = "strategyVipTwo")
public class StrategyVipTwo implements Strategy {
@Override
public BigDecimal payMoney(BigDecimal payMoney) {
// 减4元
return payMoney.subtract(new BigDecimal(4));
}
}
vip3策略
@Component(value = "strategyVipThree")
public class StrategyVipThree implements Strategy {
@Override
public BigDecimal payMoney(BigDecimal payMoney) {
// 减6元
return payMoney.subtract(new BigDecimal(6));
}
}
定义策略工厂: StrategyFactory
@Component
public class StrategyFactory implements ApplicationContextAware {
private ApplicationContext ctx;
/**
* 定义一个Map,存储等级和策略的关系
*/
private Map<Integer,String> strategyMap;
public StrategyFactory(){
strategyMap=new HashMap<>();
strategyMap.put(0,"strategyVipZero");
strategyMap.put(1,"strategyVipOne");
strategyMap.put(2,"strategyVipTwo");
strategyMap.put(3,"strategyVipThree");
}
public Strategy getStrategy(Integer level){
String s = strategyMap.get(level);
if(StringUtils.isEmpty(s)){
throw new RRException("等级不存在");
}
return ctx.getBean(s,Strategy.class);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ctx=applicationContext;
}
}
简单使用
Strategy strategy = strategyFactory.getStrategy(member.getMemberLevel());
BigDecimal bigDecimal = strategy.payMoney(new BigDecimal(pay)).setScale(2, BigDecimal.ROUND_HALF_UP);