一,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(); // 展示所有节点
}
} 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 + );
}
} public void Add(Event ev)
{
list.Add(ev);
}
public void Remove(Event ev)
{
list.Remove(ev);
}
}
}

二,我们看看输出结果:

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

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

最新文章

  1. .NET Core的日志[1]:采用统一的模式记录日志
  2. setContentType、setCharacterEncoding、pageEncoding和contentType
  3. JQuery 常用
  4. 如何使用BHO定制你的Internet Explorer浏览器
  5. java-类加载器
  6. DIV宽度自动缓慢变化
  7. php引用&amp;符号详解——————给变量起小名
  8. Java异常-一般异常和运行时异常的区别
  9. PHP 加密 和 解密 方法
  10. Ajax 核心函数
  11. PHP数据库结果集处理
  12. 转载爱哥自定义View系列--Paint详解
  13. linux上gcc
  14. 实验六:分析Linux内核创建一个新进程的过程
  15. 本篇文章主要是对jquery+ajax+C#实现无刷新操作数据库数据的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
  16. javascript小记四则:用JS写一个滚动横条文字,可以根据需要进行修改;
  17. python numpy和pandas做数据分析时去掉科学记数法显示
  18. python--第十七天总结(Django)
  19. 解决ui-router路由监听$stateChangeStart、$stateChangeSuccess、$stateChangeError不执行的问题
  20. [Solution] The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path

热门文章

  1. Firewalld--01 防火墙安全、基本指令、区域配置
  2. $[WC2018]$通道(虚树,边分练习)
  3. python学习笔记(二十):异常处理
  4. OC中SEL,类别,继承,协议的使用
  5. 阿里云推出SRT+杜比全景声直播方案,低成本打造高质量直播观感体验
  6. flutter中的表单使用
  7. Jesus Is Here
  8. [hadoop](1) MapReduce:ChainMapper
  9. vue定义自定义事件方法、事件传值及事件对象
  10. CSS3中哪些新属性—阴影、文本省略(1)