介绍:策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
@Service public class SaleServiceImpl implements SaleService { // @Autowired // NormalCalculate normalCalculate; // // @Autowired // VipCalculate vipCalculate; /** * * @param userType * @param fee * @return */ // @Override // public double calculateFee(String userType,double fee) { // if("nomal".equals(userType)){ // //省略一万行代码 // return fee*0.9; // }else if("vip".equals(userType)){ // //省略一万行代码 // return fee*0.5; // }else { // //省略一万行代码 // return fee; // } // } /** *策略模式一般使用方式,但是这种方式还要判断if else,可以利用下面spring的特性来更方便的实现 */ // @Override // public double calculateFee(String userType, double fee) { // if("nomal".equals(userType)){ // return normalCalculate.calcuteFee(fee); // }else if("vip".equals(userType)){ // return vipCalculate.calcuteFee(fee); // }else { // return fee; // } // } //仿照spring的getbean方式来实现 Map<String,CalculateStrategy> calculateMap = new HashMap<String,CalculateStrategy>(); /** * 策略模式 定义了一系列的算法,并将每一个算法封装起来,而且使他们可以互相替换,让算法独立于他们客户端 * spring特性,默认将所有的实现类,放入到list中 * @param calculateStrategyList */ public SaleServiceImpl(List<CalculateStrategy> calculateStrategyList) { for (CalculateStrategy calculateStrategy : calculateStrategyList) { calculateMap.put(calculateStrategy.getUserType(),calculateStrategy); } } @Override public double calculateFee(String userType, double fee) { CalculateStrategy calculateStrategy = calculateMap.get(userType); return calculateStrategy.calcuteFee(fee); } }
接口
public interface CalculateStrategy { public String getUserType(); public double calcuteFee(double fee); }
实现类1
@Component public class NormalCalculate implements CalculateStrategy { @Override public String getUserType() { return "normal"; } @Override public double calcuteFee(double fee) { //省略一万行代码 return fee*0.9; } }
实现类2
@Component public class VipCalculate implements CalculateStrategy { @Override public String getUserType() { return "vip"; } @Override public double calcuteFee(double fee) { //省略一万行代码 return 0.5*fee; } }