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