Шаблон проектирования для преобразования одного типа древовидной структуры в другой? - PullRequest
0 голосов
/ 07 октября 2008

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

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

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

Ответы [ 5 ]

2 голосов
/ 07 октября 2008

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

1 голос
/ 11 октября 2008

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

  1. Композит - для узлов (дерево)
  2. Стратегия - за выполнение чертежа "Алготит"

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

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) является принципом единой ответственности

Наслаждайтесь.

1 голос
/ 08 октября 2008

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

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

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

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

См. Схема адаптера

0 голосов
/ 08 октября 2008

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

Из "O'Reilly - Проектирование шаблонов интерфейсов для эффективного итерационного проектирования"

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

  • "Каскадные списки"
  • "TreeMap"

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

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

0 голосов
/ 07 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...