Простого ответа нет, знание того, когда и как добавить функциональность, - это то, чему вы должны научиться с течением времени.
Простое добавление в базовый класс кажется простым решением, но оно загрязняет ваш базовый класс. Если это класс, который вы могли бы разумно ожидать, что другая программа (или даже часть вашей программы) будет использовать, имеет ли смысл добавляемая вами функциональность в контексте ответственности вашего класса? Если это не так, это, вероятно, плохой ход. Вы добавляете зависимости, связывающие ваш базовый класс с вашим конкретным использованием? Потому что, если вы это делаете, вы можете повторно использовать код прямо из окна.
Наследование - это решение, к которому стремятся многие инженеры, и это соблазнительный маршрут. Но так как я вырос как инженер, я использую это с осторожностью. Наследование должно использоваться только в истинных отношениях, и вам нужно соблюдать поведенческий подтип
или вы будете сожалеть об этом позже. А поскольку Java допускает только одиночное наследование, это означает, что вы можете получить только один снимок для подтипа.
Композиция (особенно с интерфейсами) часто является лучшей идеей. Часто то, что выглядит как отношения, действительно имеет отношения. Или иногда все, что вам действительно нужно, это вспомогательный класс, который имеет много функций, которые принимают ваш исходный класс в качестве аргумента.
Однако с композицией есть одна проблема: вы хотите сохранить эти объекты в своем дереве. Решение здесь - интерфейсы. Вам не нужно дерево, в котором хранятся узлы. Вы хотите, чтобы объекты имели интерфейс, который может дать вам узел.
public interface HasNode {
public Node getNode();
}
Ваш класс узла - это HasNode, а getNode просто возвращает это. Ваш класс NodeVisualizer также является HasNode, и теперь вы также можете хранить NodeVisualizer в своем дереве. Конечно, теперь у вас есть другая проблема, ваше дерево может содержать NodeVisualizer и Nodes, и это не будет хорошо. Кроме того, когда вы получаете HasNode от функций дерева, вы должны привести их к нужному экземпляру, и это ужасно. Вы хотите использовать шаблоны для этого, но это другой ответ.