Composite组合模式
1. 简介
- 定义
- 组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。
- 组合模式让调用程序可以统一对待单个对象和组合对象
- 案例
- 例如文件系统的文件夹和文件结构就是此模式
- winform中,空间的基类是Control类型,子类有的是单一类型(Textbox),有的是容器类型(Panel),Add和Remove方法使用暴露Collections的方式,都有方法(eachChild)
2. 示例
namespace WindowsFormsApplication1
{
//抽象的部件类描述将来所有部件共有的行为
public abstract class Component
{
protected string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
//添加部件
public abstract void Add(Component component);
//删除部件
public abstract void Remove(Component component);
//遍历所有子部件
public abstract void eachChild();
}
//组合部件类
public class Leaf : Component
{
//叶子节点不具备添加的能力,所以不实现
public override void Add(Component component)
{
throw new NotImplementedException();
}
//叶子节点不具备添加的能力必然也不能删除
public override void Remove(Component component)
{
throw new NotImplementedException();
}
//叶子节点没有子节点所以显示自己的执行结果
public override void eachChild()
{
Console.WriteLine("{0}执行了..", name);
}
}
//组合类
public class Composite : Component
{
//用来保存组合的部件
List<Component> myList = new List<Component>();
//添加节点 添加部件
public override void Add(Component component)
{
myList.Add(component);
}
//删除节点 删除部件
public override void Remove(Component component)
{
myList.Remove(component);
}
//遍历子节点
public override void eachChild()
{
Console.WriteLine("{0}执行了..", name);
foreach (Component c in myList)
{
c.eachChild();
}
}
}
class Client
{
static void Main(string[] args)
{
//构造根节点
Composite rootComponent = new Composite();
rootComponent.Name = "根节点";
//添加两个叶子几点,也就是子部件
Leaf l = new Leaf();
l.Name = "叶子节点一";
Leaf l1 = new Leaf();
l1.Name = "叶子节点二";
rootComponent.Add(l);
rootComponent.Add(l1);
//遍历组合部件
rootComponent.eachChild();
}
}
}
3. 适用环境
- 在具有整体和部分层次的结构中,希望通过一种方式忽略整体与部分的差异,一致的对待它们
- 在一个使用面向对象语言开发的系统中要处理一个树形结构时
- 在一个系统总能够分离出叶子和容器对象,而且它们的类型不固定,需要增加一些新的类型
如果您认为这篇文章还不错或者有所收获,您可以通过右边的"打赏"功能 打赏我一杯咖啡【物质支持】,也可以点击左下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!
作者: 大师兄石头
来源: https://bigbrotherstone.cnblogs.com/
声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2020-02-16 多线程共享变量和 AsyncLocal
2020-02-16 ExecutionContext(执行上下文)综述