Шаблон проектирования для оценки различных типов правил - PullRequest
0 голосов
/ 18 мая 2018

У меня есть набор правил другого типа для оценки.Каждое правило имеет различную статистику,

  • каждое правило находится в разных таблицах базы данных.
  • логика оценки различна для каждого типа правила
  • разные сообщения должны быть сгенерированы на основепо оценке.
  • статус оценки должен быть сохранен в таблице базы данных каждого правила.

Я планирую реализовать его на основе шаблона Builder со следующим фрагментом кода

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

Здесь правило является базовым типом, и для каждого типа правила есть подтипы, которые содержат свойства правила.

Мой подход приемлем?или лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Сначала нужно уточнить, что такое шаблон Builder.По определению, приведенному в книге Head First Design Patterns:

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

Из описания вашей проблемы я не знаю, какие объекты являются «материалами» для построения правила.Я бы посоветовал вам использовать шаблон Декоратор.

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();
        }
    }
}
0 голосов
/ 22 мая 2018

Я думаю, что ваше решение в порядке.Но если вы хотите улучшить дизайн, у вас есть два варианта:

1) Переместите эту последовательность вызовов в метод внутри базового класса правила.

2), если вам не разрешено изменять правилоинтерфейс класса, вам нужно реализовать шаблон Facade для упрощения использования класса Rule.

...