У меня есть модель данных, которая содержит массив объектов Product. Перед отправкой отчета из этой модели мне необходимо запустить набор правил, которые проверяют целостность каждого объекта Product в модели. Один из способов, которым я могу думать об этом, - это иметь интерфейс Rule, например
public interface CheckRule {
boolean runRule(Product p);
}
Для каждого правила у меня может быть отдельный класс Rule, который реализует интерфейс CheckRule. После этого я могу выполнить двойной цикл для выполнения всех правил, например ::1004
for (Product p : Products) {
for (Rule r : Rules) {
if (! r.runRule(p) {
// report on the broken rule
}
}
}
Если у меня есть сотни правил, я в итоге получаю сотни классов правил, что кажется грязным способом сделать это. Альтернативой является наличие одного класса RuleManager, который имеет отдельный метод для каждого правила, например,
public class RuleManager {
boolean runRule1(Product p) { // rule 1 logic}
boolean runRule2(Product p) { // rule 2 logic}
boolean runRule3(Product p) { // rule 3 logic}
etc...
}
Это уменьшает количество классов, но означает, что я получаю один класс с сотнями методов. Оба метода кажутся мне неправильными, и мне было интересно, есть ли шаблон проектирования, который охватывает этот сценарий, который я мог бы использовать вместо этого?