Почему PolicyB
не инкапсулирует PolicyA
и не вызывает его так, как нужно?PolicyB
, очевидно, знает о PolicyA
- нет необходимости в базовых классах или наследовании.
Кажется, что во всех ваших Policy
реализациях есть какой-то общий apply
метод, с которым могут согласиться внешние вызывающие стороны?
Редактировать:
Правильно, поэтому, если это не просто случай, когда одна конкретная реализация Политики нуждается в доступе к другой, вам, вероятно, следует сосредоточиться на создании единого интерфейса для Policy
- возможно, даже класс Rule
, который можно объединить для формирования определенного Policy
- см. Шаблон спецификации.
class Rule {
allows(Foo foo);
}
class Policy {
Rule rule = new NotNullRule().and(someOtherRule);
void applyTo(Foo foo) {
if (rule.allows(foo)) {
return foo;
}
foo.disable();
}
}
Называйте их как хотите, Condition
, Rule
, Specification
- они полезны для сборки кусков логики таким образом, который не зависит от них.Затем, когда кто-то смотрит на PolicyA, он может ясно видеть правила / условия, которые управляют его поведением.
Если у вас есть реализации политик, если вам нужно применить несколько политик для чего-то, вы можетеснова используйте составной шаблон, чтобы внешние классы видели только интерфейс Policy
.Но опять же, у вас есть четкие именованные политики, на которые ссылаются, а не просто функции перекрестного вызова.