定义处理接口
public interface CalculateHandler {
   String getKey();
   boolean prepare(CalculateChainDTO calculateChainDTO);
   void calculate(CalculateChainDTO calculateChainDTO);
   default void after(CalculateChainDTO calculateChainDTO) {
   }
   /**
    * 清理
    *
    * @param calculateChainDTO
    */
   default void clean(CalculateChainDTO calculateChainDTO){
   }
}
选择计算接口
public class CalculateServiceImpl{
@PostConstruct
public void init() {
   handlersMap = handlers.stream().collect(Collectors.toMap(CalculateHandler::getKey, Function.identity(), (v1, v2) -> v1));
}
public boolean doCalculate(CalculateChainDTO calculateChainDTO) {
   Assert.isTrue(CollectionUtil.isNotEmpty(calculateChainDTO.getCalculateChainEnums()),()->new EcchServiceException(400,"执行内容不可为空"));
   for (CalculateChainEnum value : calculateChainDTO.getCalculateChainEnums()) {
      CalculateHandler calculateHandler = handlersMap.get(value.getDesc());
      boolean prepareFlag = calculateHandler.prepare(calculateChainDTO);
      if (!prepareFlag) {
         continue;
      }
      calculateHandler.calculate(calculateChainDTO);
      calculateHandler.after(calculateChainDTO);
   }
   return true;
}
}
实现计算接口
@Slf4j
@Service
public class CalculateIncomeTaxHandler implements CalculateHandler {
@Override
public String getKey() {
   return CalculateChainEnum.INCOME_TAX.getDesc();
}
@Override
public boolean prepare(CalculateChainDTO calculateChainDTO) {
。。。。。。
}
@Override
@MethodCallStatistics
public void calculate(CalculateChainDTO calculateChainDTO) {
。。。
}
}