如果节点具有不同的属性,则使用复合设计模式+MVC3架构
本文关键字:复合 设计模式 架构 +MVC3 属性 节点 如果 | 更新日期: 2023-09-27 18:28:13
对于如何实现Composite Design Pattern
以使用Asp.net MVC3架构实现树结构有一些疑问。我担心的主要原因是,树结构需要具有每个级别具有不同属性或属性的节点。
这里有一个例子:
树有一个根节点T
,它具有属性/属性X, Y ,Z
(为了方便起见,X
可以被称为Name
)相应的子节点A、B具有属性-X, L, M
相应的下一级节点具有属性-X, P, Q
相应的下一个nevel节点具有属性-X, R, T
等等
目前的设计没有任何模式,只是每个级别都是不同的类类型。
因此,如果我们想添加任何级别或更改它,它会影响整个类,因为它有依赖类。
请让我知道我是否可以应用复合设计模式,这样这些类型的依赖关系和代码维护就更容易了。在这样的场景中,应该如何定义我们的POCO或模型来遵循复合模式。我在NICedit.js中使用Asp.net MVC3、C#、DB优先的方法(用于树结构显示)。
感谢事先的帮助。
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();
例子改编自维基百科的文章。有关复合设计模式的进一步示例和解释,请参阅这个stackoverflow问题。