Рассмотрите возможность использования шаблона Visitor. Это позволяет создать элегантное строго типизированное решение, которое позволяет избежать проверки типов с использованием instanceof
или даункастинга.
public interface ComponentVisitor {
void visitFirstComponent(FirstComponent fc);
void visitSecondComponent(SecondComponent sc);
}
public class ComponentVisitorImpl implements ComponentVisitor {
public void visitFirstComponent(FirstComponent fc) {
fc.firstComponentSpecifiedMethod(a, b, c);
// Make a call *back* to FirstComponent passing in appropriate parameters.
}
}
Затем в каждом методе run()
каждого компонента вы просто вызываете соответствующий метод посетителя, который затем выполняет обратный вызов в компонент с соответствующими параметрами; например,
public class FirstComponent extends Component {
public void run(ComponentVisitor cv) {
cv.visitFirstComponent(this);
}
}
Недостатком этого подхода является то, что логике может быть трудно следовать.