Design patterns 将一种类型的树结构转换为另一种类型的设计模式?

Design patterns 将一种类型的树结构转换为另一种类型的设计模式?,design-patterns,treeview,tree,Design Patterns,Treeview,Tree,我有一种树结构,它表示地图中的层次结构,由图层类型和类别划分。对于不同类型的层,每个节点可以是不同的类(但所有节点都实现一个公共接口) 我需要将该类转换为ASP.NET TreeView控件。输入树中的每个节点都是输出树中的一个节点,其属性设置取决于节点的类型。我不想让输入树类知道UI类,所以我不能在其中编写“ToTreeViewNode()”方法。目前有4种类型的具体节点类,其中2种是复合的(包含子节点),2种是叶子。这在将来可能会改变 感觉这里有一个设计模式很想被使用,你能帮我找到它是什么吗

我有一种树结构,它表示地图中的层次结构,由图层类型和类别划分。对于不同类型的层,每个节点可以是不同的类(但所有节点都实现一个公共接口)

我需要将该类转换为ASP.NET TreeView控件。输入树中的每个节点都是输出树中的一个节点,其属性设置取决于节点的类型。我不想让输入树类知道UI类,所以我不能在其中编写“ToTreeViewNode()”方法。目前有4种类型的具体节点类,其中2种是复合的(包含子节点),2种是叶子。这在将来可能会改变


感觉这里有一个设计模式很想被使用,你能帮我找到它是什么吗?

听起来你肯定想在这里使用模型视图控制器。您的树映射结构可能是模型,视图可能是TreeView控件-您可能需要添加某种控制器类来管理两者之间的交互。

我觉得您确实想在这里使用模型视图控制器。您的树映射结构可能是模型,视图可能是TreeView控件-您可能需要添加某种控制器类来管理两者之间的交互。

a也许,要遍历输入树并构建相应的UI树?

a也许,要遍历输入树并构建相应的UI树?

My.NET有点生疏,但您可以创建一个单独的TreeNodeCollection子类,可能还有TreeNode,让他们访问您的结构,并将您的TreeNodeCollection分配给TreeViewControl的Nodes属性

TreeNodeCollection包装器将您的结构转换为TreeViewControl结构。TreeNode类可能包含对您自己节点的引用,但会将您的节点转换为TreeNode

换句话说,通过实现这两个接口,您可以使模型的接口与TreeViewControl使用的接口相适应

如果使用Visitor模式创建并行结构,则每次发生更改时都必须运行它。或者您仍然需要使用TreeNode接口包装节点


请参见

我的.NET有点生锈,但您可以创建一个单独的TreeNodeCollection子类,可能还有TreeNode,让他们访问您的结构,并将您的TreeNodeCollection分配给TreeViewControl的Nodes属性

TreeNodeCollection包装器将您的结构转换为TreeViewControl结构。TreeNode类可能包含对您自己节点的引用,但会将您的节点转换为TreeNode

换句话说,通过实现这两个接口,您可以使模型的接口与TreeViewControl使用的接口相适应

如果使用Visitor模式创建并行结构,则每次发生更改时都必须运行它。或者您仍然需要使用TreeNode接口包装节点


请参见

希望正确回答您的问题:

来自“O'Reilly-为有效的迭代设计设计接口模式”

这两种模式通常与树相关:

  • “层叠列表”
  • “树形图”
本书第6章介绍了用于显示复杂数据的十二种设计模式

我没有找到任何指向这些模式的链接,所以我想你需要在当地图书馆查阅这本书。我发现这个网页可能有一些模式可以帮助你,但我已经检查过了,它不包括这两个,或者第6章中的那个。

希望您的问题是正确的:

来自“O'Reilly-为有效的迭代设计设计接口模式”

这两种模式通常与树相关:

  • “层叠列表”
  • “树形图”
本书第6章介绍了用于显示复杂数据的十二种设计模式

我没有找到任何指向这些模式的链接,所以我想你需要在当地图书馆查阅这本书。我发现这个网页可能有一些模式可以帮助你,但我已经检查过了,它不包括这两个,或者第6章中的那个。

我不确定你想要实现什么,但(据我所知)我认为如果你想同时使用这两种方法:

  • 复合-用于节点(树)
  • 策略-用于实施绘图“算法”
  • 因此,您将有:

    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.
        }
    }
    
    最重要的是:

  • 您不需要递归绘制每个图形本身
  • 您的绘图策略可以在运行时或对象实例期间更改
  • 您可以放大每个类层次结构,而不依赖于另一个结构
  • 将其视为Web表单中的控件
  • 此外,每个对象都是(SRP)单一责任原则

  • 享受。

    我不确定你想要实现什么,但(据我所知)我认为如果你同时使用这两种方法:

  • 复合-用于节点(树)
  • 策略-用于实施绘图“算法”
  • 因此,您将有:

    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.
        }
    }
    
    最重要的是:

  • 您不需要递归绘制每个图形本身
  • 您的绘图策略可以在运行时或对象实例期间更改
  • 您可以放大每个类层次结构,而不依赖于另一个结构
  • 将其视为Web表单中的控件
  • 此外,每个对象都是(SRP)单一责任原则

  • 享受。

    是的,但我说的是穿过树的实际动作。我试图避免的是很多[“如果(node是GroupLayerNode)这样做,否则就那样做”]。是的,但我说的是遍历树的实际行为