Как определить и привести к конкретному объекту композита при его использовании? - PullRequest
1 голос
/ 01 сентября 2011

Я хотел бы иметь составную структуру, которая построена из JSON. Каждый элемент может иметь только один тип дочерних элементов, поэтому группа может содержать только группы или только листья. Затем на основе этого дерева я хочу нарисовать графический компонент пользовательского интерфейса, который будет отображаться по-разному и выполнять различные действия в зависимости от его типа (группа или лист).

Вопрос в том, как определить, что визуализировать и каких слушателей прикрепить к рисунку. Дерево - это всего лишь модель, поэтому оно не должно содержать методов для построения графика или управления.

Это хорошая или плохая практика, чтобы проверить, является ли она экземпляром чего-либо, и привести компонент к правильному типу, а затем выполнить правильную настройку?

Как насчет наличия enum и getter для его определения?

Я знаю ответы, которые будут работать, но я хочу услышать о хороших практиках.

1 Ответ

0 голосов
/ 01 сентября 2011

Это хорошая или плохая практика, чтобы проверить, является ли это чем-то экземпляром и приведите компонент к правильному типу, а затем выполните правильную настройку?

Лично я думаю, что это сломает образец. Согласно википедии:

При работе с древовидными данными программистам часто приходится различать лист-узел и ветвь. Это делает код более сложный и, следовательно, подверженный ошибкам. Решением является интерфейс, который позволяет обрабатывать сложные и примитивные объекты равномерно . В объектно-ориентированное программирование, композит представляет собой объект, разработанный как состав одного или нескольких похожих объектов, все из которых имеют сходные функциональность.

Составной - это шаблон, который поможет вам использовать как контейнер, так и лист как один и тот же тип. Смотри эту диаграмму .

Я предлагаю вам добавить и абстрагировать метод draw в класс компонента и позволить его подклассам реализовать его. У Leaf будет другая реализация, чем у Composite. Таким образом, клиентский класс, пересекающий ваше дерево, не должен знать, является ли узел листом или нет, он может просто вызвать метод draw для него.

...