• 组合模式


    组合模式的透明方式:Component中声明所有用来管理子对象的方法,包括Add Remove等,这样实现Component的所有子类都具备了Add Remove,这样做的好处是叶节点和枝节点对于外界没有区别,它们具备完全一致的行为接口,问题是leaf类本身不具备add remove 方法的功能所以实现它是没有意义的。

    安全方式:Component接口中不去声明add和remove方法,子类的leaf不用实现它,而是在Composite声明所有用来管理子类对象的方法,不过由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,不方便。

    抽象类:

        public abstract class AbstractClass
        {
    
            public string name;
    
            public ArrayList list;
    
            public abstract void Add(AbstractClass item);       //增加一个子节点
    
            public abstract void Remove(AbstractClass item);    //去掉一个子节点
    
            public abstract string Print();                     //打印当前节点
    
        }

    枝节点:

        public class Limb:AbstractClass
        {
    
            public Limb()
            {
    
                list = new ArrayList();
    
            }
    
            public override void Add(AbstractClass item)
            {
    
                list.Add(item);
    
            }
    
     
    
            public override void Remove(AbstractClass item)
            {
    
                if(list.Contains(item))
    
                    list.Remove(item);
            }
    
            public override string Print()
            {
                Console.Write(name + "
    ");
    
                if(list.Count != 0)
                {
    
                    for(int i = 0;i<list.Count;i++)
    
                    {
    
                        Console.Write("(Parent is " + name + ")");
    
                        ((AbstractClass)list[i]).Print();
    
                    }
    
                }
                return name;
            }
    
        }

      叶子节点:

        public class Leaf:AbstractClass
        {
            public Leaf()
            {
    
                list = null;
    
            }
            public override void Add(AbstractClass item)
            {
            }
    
            public override void Remove(AbstractClass item)
            { 
            }
    
            public override string Print()
            {
                Console.Write(name + ",");
                return this.name;
            }
    
        }

    引用:

            static void Main(string[] args)
            {
                AbstractClass Tree = new Limb();
    
                GetTree(Tree);
    
                PrintTree(Tree);
    
                Console.Read();
    
            }
    
            public static void GetTree(AbstractClass Tree)
            {
                Tree.name = "1";
    
                AbstractClass leaf2 = new Leaf();
    
                leaf2.name = "2";
    
                Tree.Add(leaf2);
    
                AbstractClass limb3 = new Limb();
    
                limb3.name = "3";
    
                Tree.Add(limb3);
    
                AbstractClass leaf4 = new Leaf();
    
                leaf4.name = "4";
    
                limb3.Add(leaf4);
    
                AbstractClass leaf5 = new Leaf();
    
                leaf5.name = "5";
    
                limb3.Add(leaf5);
            }
    
            public static void PrintTree(AbstractClass Tree)
            {
                Tree.Print();
            }
  • 相关阅读:
    LuoguP2765 魔术球问题
    LuoguP1402 酒店之王
    luoguP4313 文理分科
    玲珑杯 1138
    codeforces 822 D. My pretty girl Noora(dp+素数筛)
    codeforces 822 C. Hacker, pack your bags!(思维+dp)
    51nod 1376 最长递增子序列的数量(不是dp哦,线段树 +  思维)
    hdu4565 So Easy!(矩阵快速幂)
    atcode E
    atcoder D
  • 原文地址:https://www.cnblogs.com/nygfcn1234/p/3392013.html
Copyright © 2020-2023  润新知