用于评估不同类型规则集的设计模式

时间:2018-05-18 19:24:24

标签: design-patterns architecture

我有一套不同类型的要评估的规则。每个规则都有不同的统计信息,

  • 每个规则都在不同的数据库表中。
  • 每种规则类型的评估逻辑都不同
  • 必须根据评估生成不同的消息。
  • 评估状态应保存到每个规则的数据库表中。

我计划根据Builder模式实现它,并使用以下代码段

foreach(Rule rule in Rules){
  var result = rule.evaluate();
  var message = rule.getMessage(result);
  rule.saveMassage(message);
  rule.updateDB(result);
}

此处规则是基本类型,每种规则类型都有子类型,其中包含规则的属性。

我的方法好吗?或者更好的方法呢?

2 个答案:

答案 0 :(得分:1)

我认为您的解决方案没问题。但是如果你想改进设计,你有两个选择:

1)将此调用序列移动到Rule基类内的方法中。

2)如果不允许修改规则类接口,则需要实现Facade模式以简化规则类的使用。

答案 1 :(得分:0)

首先需要弄清楚Builder模式是什么。根据Head First Design Patterns一书的定义:

Use the Builder Pattern to encapsulate the construction of a product and 
allow it to be constructed in steps.

从您的问题描述中我不知道哪些对象是构建规则的“材料”。我建议你改用Decorator模式。

public interface Rule {
    public void evaluate();
}

public class RuleType1 implements Rule {
    @Override
    public void evaluate() {
        //Evaluation Logic of Type 1
    }
}

public class RuleType2 implements Rule {
    @Override
    public void evaluate() {
        //Evaluation Logic of Type 2 
    }
}

public class RuleEvaluator implements Rule {
    private Rule rule;

    public RuleEvaluator(Rule rule) {
        this.rule = rule;
    }

    @Override
    public void evaluate() {
        // 1. Evaluation logic
        this.rule.evaluate();
        // 2. Update message
        // 3. Update status
        // 4. Update database
    }
}

public class RuleDemo {
    public static void main(String[] args) {
        //Get the list of rules
        for(Rule rule : rules) {
            Rule temp = new RuleEvaluator(rule);
            temp.evaluate();
        }
    }
}