Шаблон проектирования для преобразования одного типа древовидной структуры в другой?

#design-patterns #treeview #tree

Вопрос:

У меня есть своего рода древовидная структура, представляющая иерархию слоев на карте, разделенных по типам слоев и категориям. Каждый узел может быть разным классом для разных типов слоев (но все узлы реализуют общий интерфейс).

Мне нужно преобразовать этот класс в ASP.NET Управление просмотром деревьев. Каждый узел во входном дереве является узлом в выходном дереве с набором свойств, которые зависят от типа узла. Я не хочу, чтобы классы дерева ввода знали классы пользовательского интерфейса, поэтому я не могу написать в них метод «ToTreeViewNode ()». В настоящее время существует 4 типа классов конкретных узлов, 2 из которых являются составными (содержат дочерние узлы) и 2 из них являются листьями. Это может измениться в будущем.

Такое ощущение, что здесь есть шаблон дизайна, который нужно использовать, не могли бы вы помочь мне найти, что это такое?

Комментарии:

1. Пожалуйста, предоставьте подробную информацию о том, о скольких типах узлов мы здесь говорим…

Ответ №1:

Возможно, посетитель, чтобы пройти по дереву ввода и построить соответствующее дерево пользовательского интерфейса?

Комментарии:

1. Это имеет тот недостаток, что приходится перестраивать дерево каждый раз, когда исходная модель изменяет структуру

2. Также посетитель не будет работать, если у вас нет контроля над классами исходного дерева. Я должен преобразовать абстрактный запрос в запрос mongodb в плагине mongodb-store для одного из моих проектов, и у меня нет контроля над классами абстрактных запросов.

Ответ №2:

Мой .NET немного заржавел, но вы могли бы создать отдельный подкласс TreeNodeCollection и, возможно, TreeNode, предоставить им доступ к вашей структуре и назначить вашу коллекцию TreeNodeCollection свойству узлов элемента управления TreeViewControl.

Оболочка TreeNodeCollection преобразует вашу структуру в структуру TreeViewControl. Класс TreeNode, вероятно, будет содержать ссылку на ваши собственные узлы, но преобразует ваши узлы в TreeNodes.

Другими словами, реализуя эти два интерфейса, вы адаптируете интерфейс своей модели к интерфейсу, используемому TreeViewControl,

Если вы используете шаблон посетителя для создания параллельной структуры, вам придется запускать его каждый раз, когда происходят изменения. Или вам все равно придется обернуть свой узел интерфейсом TreeNode.

См. Шаблон адаптера

Ответ №3:

Я не уверен, чего вы пытаетесь достичь, но (как я понимаю) Я думаю, что если ты собираешься использовать и то, и другое:

  1. Составной — для узлов (дерева)
  2. Стратегия — для реализации розыгрыша «algotithm»

так что у вас будет:

 public class Node
{
   public IDraw genericDrawing;
   public Node[] Childs;
   public Node() { //init you genericDrawinf }
   public void Draw() 
   {
      genericDrawing.Draw(this);
      foreach (Node child in Childs)
      {
         child.Draw();
      }
   }
}

public interface IDraw
{
    void Draw(Node node);
}
public class SimpleDraw : IDraw
{
    public void Draw(Node node)
    {
       // code your stuf in here.
    }
}
 

самое замечательное то, что:

  1. вам не нужен рекурсивный рисунок, каждый из которых рисует сам себя
  2. ваша стратегия рисования может измениться во время выполнения или во время создания экземпляра объекта
  3. вы можете масштабировать иерархию классов каждого из вас без зависимости от другой структуры.
  4. думайте об этом как об элементах управления в ваших веб-формах
  5. более того, каждый объект является (SRP) Единым Принципом ответственности

Наслаждаться.

Ответ №4:

Мне кажется, что вы хотите использовать здесь контроллер представления модели. Ваша структура древовидной карты, вероятно, является Моделью, представление — это элемент управления TreeView-вам, вероятно, нужно добавить какой-то класс контроллера для управления взаимодействием между ними.

Комментарии:

1. Да, но я говорю о самом акте обхода дерева. Чего я пытаюсь избежать, так это многого [«если (узел-это groupplayernode) сделайте это, иначе сделайте это»].

Ответ №5:

Надеюсь, что ваш вопрос верен:

Из «Шаблонов интерфейсов O’Reilly — Проектирование для эффективного проектирования итераций»

У вас есть эти два шаблона, которые обычно ассоциируются с деревьями:

  • «Каскадные списки»
  • «Карта деревьев»

Глава 6 этой книги содержит около двенадцати шаблонов проектирования отцов, которые будут использоваться для отображения сложных данных.

Я не нашел никаких ссылок на эти шаблоны, так что, думаю, вам нужно будет проверить книгу в местной библиотеке. Я нашел эту веб-страницу, на которой могут быть некоторые отцы, чтобы помочь вам, но я проверил, и там нет этих двух или тех, что из главы 6. http://www.welie.com/patterns/