0

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

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

感觉这里有一种设计模式很想用,你能帮我看看它是什么吗?

4

5 回答 5

2

或许是一个访问者,来遍历输入树并构建相应的 UI 树?

于 2008-10-07T07:34:58.797 回答
1

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

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

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

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

请参阅适配器模式

于 2008-10-08T10:30:57.227 回答
1

我不确定您要达到什么目标,但是(据我了解)我认为,如果您要同时使用两者:

  1. Composite - 用于节点(树)
  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. 把它想象成 Web 表单中的控件
  5. 此外,每个对象都是(SRP)单一职责原则

享受。

于 2008-10-11T10:02:09.173 回答
0

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

于 2008-10-07T07:14:06.873 回答
0

希望你的问题是正确的:

来自“O'Reilly - Designing Interfaces Patterns for Effective Iteration Design”

你得到了这两种通常与树相关的模式:

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

本书的第 6 章作为用于显示复杂数据的大约 12 种设计模式模式。

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

于 2008-10-08T10:51:15.903 回答