Design patterns 将一种类型的树结构转换为另一种类型的设计模式?
我有一种树结构,它表示地图中的层次结构,由图层类型和类别划分。对于不同类型的层,每个节点可以是不同的类(但所有节点都实现一个公共接口) 我需要将该类转换为ASP.NET TreeView控件。输入树中的每个节点都是输出树中的一个节点,其属性设置取决于节点的类型。我不想让输入树类知道UI类,所以我不能在其中编写“ToTreeViewNode()”方法。目前有4种类型的具体节点类,其中2种是复合的(包含子节点),2种是叶子。这在将来可能会改变Design patterns 将一种类型的树结构转换为另一种类型的设计模式?,design-patterns,treeview,tree,Design Patterns,Treeview,Tree,我有一种树结构,它表示地图中的层次结构,由图层类型和类别划分。对于不同类型的层,每个节点可以是不同的类(但所有节点都实现一个公共接口) 我需要将该类转换为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-为有效的迭代设计设计接口模式” 这两种模式通常与树相关:
- “层叠列表”
- “树形图”
希望您的问题是正确的: 来自“O'Reilly-为有效的迭代设计设计接口模式” 这两种模式通常与树相关:
- “层叠列表”
- “树形图”
我不确定你想要实现什么,但(据我所知)我认为如果你想同时使用这两种方法:
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.
}
}
最重要的是:
享受。我不确定你想要实现什么,但(据我所知)我认为如果你同时使用这两种方法:
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.
}
}
最重要的是:
享受。是的,但我说的是穿过树的实际动作。我试图避免的是很多[“如果(node是GroupLayerNode)这样做,否则就那样做”]。是的,但我说的是遍历树的实际行为