首页 > 解决方案 > 弹簧和不同的方式来避免使用新的

问题描述

我使用弹簧靴2。

我需要验证许多条件,而不是创建许多 if,而是为实现 isValid 方法的每个条件创建一个类。

public interface Rulecondition<T>{
  boolean isValid(){
}

public class ClientGroup implements Rulecondition<Billing>{
  private Billing billing;

  public ClientGroup(Billing billing){
    this.billing=billing;
  }

  @Override
  public boolean isValid(){
    return true; //only for example...
  }

}

我创建了一个使用所有条件流并验证一切是否有效的类

@Component
public class ConditionRuleEngine{
  private List<Rulecondition> rules = new ArrayList<>();

  public ConditionRuleEngine(){

  }


  public void addRule(Rulecondition rule){
    rules.add(rule);
  }

  public boolean conditionApply(){
    retunr rules.stream().allMatch(r->.isValid()));
  }

}

在服务类中,我自动装配了 ConditionRuleEngine

@Service
public class OperationService(){

  private final ConditionRuleEngine conditionRuleEngine;

  @Autowired
  public OperationService OperationService(final ConditionRuleEngine conditionRuleEngine){
    this.conditionRuleEngine=conditionRuleEngine;
  }

  public void execute(Billing billing){

      //need to add condition

      conditionRuleEngine.run(); 
  }

}

有没有更好的方法来添加条件然后创建一个新的?

ClientGroup cg = new ClientGroup(billing);
conditionRuleEngine.add(cg);

标签: springdesign-patterns

解决方案


是的,但是有一项更改可以帮助您解决问题:TRulecondition接口中删除泛型类型参数 ,。由于Rulecondition只包含一个isValid不依赖于泛型参数的方法,T因此可以安全地删除该参数:

public interface RuleCondition {
    boolean isValid();
}

删除的原因是它简化了基于 Spring 的解决方案来解决您的问题。如果没有该通用参数,您现在可以将每个RuleCondition实现标记为@Component(使它们有资格进行依赖注入)并将 a 自动装配List<RuleCondition>到您的ConditionRuleEngine类中:

@Component
public class ConditionRuleEngine {

    @Autowired
    private List<RuleCondition> rules;

    // ...other implementation details...
}

Spring 会将所有实现的组件RuleCondition注入该rules领域。


虽然删除通用参数T简化了解决方案,但它不是必需的。

如果您确实需要维护泛型参数,T那么您可以RuleCondition通过在类型中指定参数来自动装配每个泛型参数List

public interface RuleCondition<T> {
    boolean isValid(T value);
}

@Component
public class ClientGroup implements RuleCondition<Billing> {

    @Override
    public boolean isValid(Billing value) {
        // ...
    }
}

@Component
public class ConditionRuleEngine {

    @Autowired
    private List<RuleCondition<Billing>> billingRules;

    @Autowired
    private List<RulecCndition<Other>> otherRules;

    // ...other implementation details...
}

Spring 将注入所有RuleCondition匹配泛型参数的对象。例如,billingRules将包含 a Listof all RuleCondition<Billing>(并且不会包含任何RulecCndition<Other>对象。


推荐阅读