Не стоит забывать про возможность использования стратегий.
Очень приблизительный код, но суть ясна:
private static final Map<Class, Action> strategies = new HashMap<>();
private static interface Action {
void doAction(Params params);
}
static {
strategies.put(ANodeType.class, new Action() {
public void doAction(Params params){
...
}
});
strategies.put(BNodeType.class, new Action() {
public void doAction(Params params){
...
}
});
}
...
public void handleTreeNode(Object node, Params params){
strategies.get(node.getClass()).doAction(params);
}
А вообще есть вариант реализовать всеми типами нод интерфейс Action (переименовав его, например, в JTreeNode) и выглядеть это будет примерно так:
public void handleTreeNode(JTreeNode node, Params params){
node.doAction(params);
}
Но тут нужно смотреть возможно ли изменить код классов, которые хранятся в дереве и насколько это будет архитектурно правильно. (Специальные ли это объекты для дерева или общие объекты системы)