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的方法即可将所有人的说话事件都实现了