利用策略模式优化if-else

一、定义

策略模式(Strategy Pattern):策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化.

二、优缺点

优点:

1.策略模式符合开闭原则。

2.可以避免使用多重条件判断。例如(if...else...等)

3.使用策略模式可以提高算法的保密性和安全性。

缺点:

1.使用方必须知道所有的策略,并且自行决定使用哪一个策略。

2.代码中会产生大量的策略类,增加维护难度。

三、代码实现

需求:我们有两个数字,要根据传入的type来判断这两个数字应该是相加,还是相减。

1.首先我们定义一个抽象类,或者接口

public interface CalculateService {

  void calculateValue(Integer number1, Integer number2);

}

2.接下来我们定义策略的工厂.

@Component
public class CalculateServiceFactory {

  @Resource
  private Map calculateServiceStrategyMap = new ConcurrentHashMap<>(5);


  public CalculateService getCalculateServiceImpl(String type) {
    return calculateServiceStrategyMap.get(type);
  }

}

3.我们定义不同的实现类,重点在于bean的名字,bean的名字其实就是我们if...else判断的条件

减法的实现类 

@Slf4j
@Service("subtraction")
public class subtractionCalculateServiceImpl implements CalculateService {


  @Override
  public void calculateValue(Integer number1, Integer number2) {
    Integer result = number1 - number2;
    log.debug("策略模式====>计算类结果为" + result);
  }
}

加法的实现类 

@Service("addition")
@Slf4j
public class AdditionCalculateServiceImpl implements CalculateService {

  @Override
  public void calculateValue(Integer number1, Integer number2) {
    Integer result = number1 + number2;
    log.debug("策略模式====>计算类结果为" + result);
  }
}

4.策略模式与传统的if...else的比较

  public void calculateTraditionalMethod(String type) {
    Integer number1 = 1;
    Integer number2 = 2;

    if (type == "addition") {
      Integer result = number1 + number2;
      System.out.print("传统实现====>计算类结果" + result);
    } else if (type == "subtraction") {
      Integer result = number1 - number2;
      System.out.print("传统实现====>计算类结果" + result);
    }
  }

  @Autowired
  private CalculateServiceFactory calculateServiceFactory;

  
  //这里直接根据传入的type 去找到对应的bean 所以不需要进行判断
  public void calculateStrategyMethod(String type) {
    calculateServiceFactory.getCalculateServiceImpl(type);
  }

你可能感兴趣的:(技术专栏,java,spring,后端,策略模式)