【问题标题】:using Composite design Pattern if the nodes have different attributes + MVC3 architecture如果节点具有不同的属性 + MVC3 架构,则使用复合设计模式
【发布时间】:2013-08-19 07:12:51
【问题描述】:

对于如何实现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 优先方法(用于树结构显示)。

提前感谢帮助。

【问题讨论】:

    标签: c# asp.net-mvc-3 tree composite


    【解决方案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,了解有关复合设计模式的更多示例和说明。

    【讨论】:

    • 非常感谢 Sam,您的详细解释。
    • 已经存在的系统包含所有被视为不同类型的节点,因此维护或向树结构添加级别是一场噩梦。您的示例非常有价值。只是想再澄清一个疑问。当前的实现就像一个 Document 类作为根节点,然后 Element 节点作为它的子节点,然后是属性等,每个类都具有相关子类(节点)的导航属性。最后在 JStreeview 中以树状结构显示。所以在这个场景中如果我们使用复合模式,MVC3模型中的b/w类关系是如何维护的。
    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多