c# 组合模式

结构图:


抽象对象:

复制代码 代码如下:

    abstract class Component

    {

        protected string name;

        public Component(string name)

        {

            this.name = name;

        }

        public abstract void Add(Component c);

        public abstract void Remove(Component c);

        public abstract void Display(int depth);

    }


无子节点的:

复制代码 代码如下:

    class Leaf : Component

    {

        public Leaf(string name)

            : base(name)

        { }

        public override void Add(Component c)

        {

            //throw new NotImplementedException();

            Console.WriteLine("Cannot add to a Leaf");

        }

        public override void Remove(Component c)

        {

            //throw new NotImplementedException();

            Console.WriteLine("Cannot remove to a Leaf");

        }

        public override void Display(int depth)

        {

            //throw new NotImplementedException();

            Console.WriteLine(new string('-', depth) + name);

        }

    }


可以有子结点:

复制代码 代码如下:

    class Composite : Component

    {

        private List children = new List();

        public Composite(string name)

            : base(name)

        { }

        public override void Add(Component c)

        {

            //throw new NotImplementedException();

            children.Add(c);

        }

        public override void Remove(Component c)

        {

            //throw new NotImplementedException();

            children.Remove(c);

        }

        public override void Display(int depth)

        {

            //throw new NotImplementedException();

            Console.WriteLine(new string('-', depth) + name);

            foreach (Component component in children)

            {

                component.Display(depth + 2);

            }

        }

    }


 主函数调用:

复制代码 代码如下:

    class Program

    {

        static void Main(string[] args)

        {

            Composite root = new Composite("root");

            root.Add(new Leaf("Leaf A"));

            root.Add(new Leaf("Leaf B"));

            Composite comp = new Composite("Composite X");

            comp.Add(new Leaf("Leaf XA"));

            comp.Add(new Leaf("Leaf XB"));

            root.Add(comp);

            Composite comp2 = new Composite("Composite X");

            comp2.Add(new Leaf("Leaf XYA"));

            comp2.Add(new Leaf("Leaf XYB"));

            comp.Add(comp2);

            root.Display(1);

            Console.ReadKey();

        }

    }

 

0.218834s