对如何使用Asp.net MVC3架构实现Composite Design Pattern
实现树结构有一些疑问。我的担忧主要是由于要求树结构具有每个级别具有不同属性或属性的节点。
以下是一个例子:
树有一个根节点 - T
,其属性/属性X, Y ,Z
(X
可以被称为Name
以方便我们使用)
对应的子节点A,B具有属性 - X, L, M
相应的下一级节点具有属性 - X, P, Q
相应的下一个nevel节点具有属性 - X, R, T
等等。
目前的设计不是用任何模式开发的,只是每个级别都是不同的类型。
因此,如果我们想要添加任何级别或更改它会影响整个类,因为它具有依赖类。
如果我可以应用复合设计模式,请告诉我,以便这些类型的依赖关系和代码维护更容易。在这种情况下,我们应该如何定义POCO或模型以遵循复合模式。我正在使用Asp.net MVC3,C#,DB第一种方法使用NICedit.js(用于树形结构显示)。
提前感谢帮助。
答案 0 :(得分:1)
当您想要访问节点而不关心它们的类型时,会更多地使用Composite pattern
。你是如何访问节点的?你在跟他们做什么?您的目标是改善维护。仅当您需要将每个节点视为同一对象时,该模式才适用。
尝试类似以下代码的内容:
public interface IMyNode
{
void Print();
}
public class A : IMyNode
{
public void Print()
{
Console.WriteLine("I am a child of T. A or B");
}
}
public class C : IMyNode
{
public void Print()
{
Console.WriteLine("I am a child of A or B, I am C.");
}
}
public class D : IMyNode
{
public void Print()
{
Console.WriteLine("I am a child of C. I am D.");
}
}
public class CompositeMyNode : IMyNode
{
private readonly List<IMyNode> nodes;
public CompositeMyNode()
{
nodes= new List<IMyNode>();
}
public void Add(IMyNode node)
{
nodes.Add(node);
}
public void AddRange(params IMyNode[] node)
{
nodes.AddRange(node);
}
public void Delete(IMyNode node)
{
nodes.Remove(node);
}
public void Print()
{
foreach (IMyNode childMyNode in nodes)
{
childMyNode.Print();
}
}
}
在这种情况下,我们会在每个节点上引用信息,而不关心我们实际拥有哪些节点。
var compositeMyNode = new CompositeMyNode();
var compositeMyNode1 = new CompositeMyNode();
var compositeMyNode2 = new CompositeMyNode();
compositeMyNode1.Add(new A());
compositeMyNode2.AddRange(new A(), new A());
compositeMyNode.AddRange(new C(), compositeMyNode1, compositeMyNode2);
// Will print 4 nodes: A, A, A, C.
compositeMyNode.Print();
改编自Wikipedia article的示例。另请参阅此stackoverflow question以获取有关复合设计模式的更多示例和说明。