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

StackOverflow https://stackoverflow.com/questions/177459

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

  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) Единым Принципом Ответственности

Наслаждайся.

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

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

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

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

  • "Каскадные списки"
  • "Древовидная карта"

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top