如果节点具有不同的属性,则使用复合设计模式+MVC3架构



对于如何实现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问题。

最新更新