C#设计模式:组合模式(Composite Pattern)

一,C#设计模式:组合模式(Composite Pattern)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _9.组合模式
{
    //组合模式主要用来处理一类具有“容器特征”的对象——即它们在充当对象的同时,又可以作为容器包含其他多个对象。
    //组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性
    class Program
    {
        static void Main(string[] args)
        {
            People p = new People("开始");    //定义一个根容器
            Chinese e = new Chinese("中国人");
            p.Add(e);   // 为容器添加节点

            Usa e1 = new Usa("美国人");
            p.Add(e1);  // 为容器添加节点

            People p2 = new People("地球人");    //定义一个容器,理解为装在根容器中
            p2.Add(e);  // 为容器添加节点
            p2.Add(e1); // 为容器添加节点

            People p3 = new People("地球人");   //定义一个容器,理解为装在P2容器中
            p3.Add(e);  // 为容器添加节点
            p3.Add(e1); // 为容器添加节点
            p2.Add(p3); // 为容器添加节点

            p.Add(p2);  // 为容器添加节点
            p.Say(1);   // 展示所有节点
        }
    }

    public abstract class Event
    {
        public abstract void Say(int a);
    }

    public class Chinese : Event
    {
        public string Name { get; set; }
        public Chinese(string name)
        {
            Name = name;
        }
        public override void Say(int a)
        {
            Console.WriteLine(new String('-', a) + Name + ":我们说中文");
        }
    }
    public class Usa : Event
    {
        public string Name { get; set; }
        public Usa(string name)
        {
            Name = name;
        }
        public override void Say(int a)
        {
            Console.WriteLine(new String('-', a) + Name + ":我们说英文");
        }
    }

    public class People : Event           //People是一个对象也是一个容器,将我们要的组合装起来
    {
        List<Event> list = new List<Event>();//定义可以存储节点的集合
        public string Name { get; set; }
        public People(string name)
        {
            Name = name;
        }
        public override void Say(int a)
        {
            Console.WriteLine(new String('-', a) + Name);
            foreach (var item in list)
            {
                item.Say(a + 2);
            }
        }

        public void Add(Event ev)
        {
            list.Add(ev);
        }
        public void Remove(Event ev)
        {
            list.Remove(ev);
        }
    }
}

 二,我们看看输出结果:

1》在上述代码中我们添加了三个容器如开始,地球人和地球人,这样我们就有四层结构的树形集合,当我们要执行这么复杂的结构,我们只需要添加一个people容器,这个容器中有节点,而此时节点可以无限添加,若我们需要多层级结构是,我们字需要在节点添加一个people容器,这样我们就可以实现无限级的复杂结构

2》当然我们如果只需要使用两级,我们也是可以只往容器添加节点即可。例如:每一个人种都要说话,但是我们有N个人种,这时我们不可能每一个人种对象都实例一次,这时我们可以使用这个组合模式,我们将每个人种都添加到容器中,这时我们将N个人种添加到容器里了,我们只需要调用people容器的Say的方法即可将所有人的说话事件都实现了

原文地址:https://www.cnblogs.com/May-day/p/8615194.html