Если satistifed()
является свойством компонента (корневой тип в шаблоне), то это свойство должно быть объявлено в интерфейсе:
public interface Component {
boolean isSatisfied();
}
Тогда рекурсияпроисходит как следствие вызова метода на дочерних компонентах:
public boolean isSatisfied() {
if( type.equals("and")) {
for( Component component : components ) {
if( !component.isSatisfied() ) {
return false;
}
}
return true;
}
}
(Если заданный component
для одной из итераций цикла окажется составным, тот же метод будет вызван снова, следовательно,, рекурсия).
Пока мы на этом, дизайн также может быть улучшен за счет исключения использования строки в качестве логического маркера (часть, где type.equals("and")
). Если данный составной объект не будет меняться между типом AND и типом OR во время выполнения, рассмотрите возможность использования отдельных классов AndComposite
и OrComposite
. Если по какой-то причине вы хотите, чтобы ваш композит изменял свое поведение во время выполнения, я бы использовал boolean
или перечислимый тип, чтобы различать их.