用于将一种树结构转换为另一种树结构的设计模式?

时间:2008-10-07 07:08:40

标签: design-patterns treeview tree

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

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

感觉有一种设计模式在这里瘙痒使用,你能帮我找到它是什么吗?

5 个答案:

答案 0 :(得分:2)

可能是Visitor走路输入树并构建相应的UI树?

答案 1 :(得分:1)

我的.NET有点生疏,但你可以做的是创建一个单独的TreeNodeCollection子类和可能的TreeNode,让他们访问你的结构,将你的 TreeNodeCollection赋值给Nodes属性TreeViewControl。

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

换句话说,通过实现这两个接口,您可以将模型的接口调整为TreeViewControl使用的接口,

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

请参阅Adapter pattern

答案 2 :(得分:1)

我不确定你想要达到的目标,但(据我所知)我认为如果你要同时使用这两种方法:

  1. 复合 - 用于节点(树)
  2. 策略 - 实施图纸“algotithm”
  3. 所以你将拥有:

    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. 将其视为Web表单中的控件
    5. 此外,每个对象都是(SRP)单一责任原则
    6. 享受。

答案 3 :(得分:0)

对我来说,这听起来好像你想在这里使用Model-View-Controller。您的树映射结构可能是Model,View是TreeView控件 - 您可能需要添加某种Controller类来管理两者之间的交互。

答案 4 :(得分:0)

希望你的问题是正确的:

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

你有这两种模式通常与树有关:

  • “级联列表”
  • “树形图”

本书第6章介绍了用于显示复杂数据的十二种设计模式。

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