2

Composite Design Pattern对如何使用 Asp.net MVC3 架构实现树形结构有一些疑问。我的担心主要是由于要求树结构具有每个级别具有不同属性或属性的节点。

这是一个例子:

树有一个根节点 -T具有属性/属性X, Y ,Z(为了方便我们可以参考) 对应的子节点 A , B 有属性 -X对应的 下一级节点有属性 - 对应的下一个 nevel 节点有属性 -等等。NameX, L, MX, P, QX, R, T

目前的设计没有以任何模式开发,只是每个级别都是不同的类类型。

因此,如果我们想要添加任何级别或更改它会影响整个类,因为它具有依赖类。

请让我知道我是否可以应用复合设计模式,以便这些类型的依赖项和代码维护更容易。在这种情况下,应该如何定义我们的 POCO 或模型以遵循复合模式。我正在使用带有 NICedit.js 的 Asp.net MVC3、C#、DB 优先方法(用于树结构显示)。

提前感谢帮助。

4

1 回答 1

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 文章。另请参阅此stackoverflow 问题以获取有关复合设计模式的更多示例和解释。

于 2013-08-19T07:39:09.613 回答