(一)定义:组合多个对象形成树形结构以表示为“部分--整体”的结构层次。组合模式使得用户对单个对象和组合对象的使用具有一致性。
1.1 UML类图:

1.2 类与对象间的关系
Component:部件抽象接口。
① 为组合的对象声明接口。
② 某些情况下,实现从此接口派生出所有类共有的默认行为。
③ 定义一个接口可以访问及管理它的多个子部件(GetChild)。
④ 如果必要,也可以在递归结构中定义一个接口访问它的父节点,并且实现它。
Leaf:叶部件
① 在组合中表示叶节点对象,叶节点没有子节点。
② 定义组合中原接口对象的行为。
Composite:组合类
① 定义有儿子节点(子部件)的部件的行为
② 存储儿子节点(子部件)
③ 在Component接口中实现与子部件相关的操作
典型调用顺序图

组合模式-源码public abstract class Component
{
protected string name;
public Component(string name)
{
this.name = name;
}
public abstract void Add(Component c);
public abstract void Remove(Component c);
public abstract void Display(int depth);
}
public class Leaf : Component
{
public Leaf(string name)
: base(name)
{
}
public override void Add(Component c)
{
Console.WriteLine("不能添加到叶子节点");
}
public override void Remove(Component c)
{
throw new NotImplementedException();
}
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
}
}
public class Composite : Component
{
private List<Component> children = new List<Component>();
public Composite(string name)
: base(name)
{
}
public override void Add(Component c)
{
children.Add(c);
}
public override void Remove(Component c)
{
children.Remove(c);
}
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
foreach (Component c in children)
{
c.Display(depth + 2);
}
}
}
public class Client
{
private Composite root = new Composite("root");
public Client()
{
root.Add(new Leaf("Leaf A"));
root.Add(new Leaf("Leaf B"));
Composite comp = new Composite("Composite X");
comp.Add(new Leaf("Leaf XA"));
comp.Add(new Leaf("Leaf XB"));
root.Add(comp);
Composite comp2 = new Composite("Composite XY");
comp2.Add(new Leaf("Leaf XYA"));
comp2.Add(new Leaf("Leaf XYB"));
comp.Add(comp2);
root.Add(new Leaf("Leaf C"));
Leaf leaf = new Leaf("Leaf D");
root.Add(leaf);
}
public void Print()
{
root.Display(1);
}
}
源码分析:


(二) 项目案例分析 源码下载
案例描述:假设某个公司的OA系统要计算员工和部门工资。部门有部门主管,其他下有多名员工。既要计算个体员工工资,又要计算部门开支公司。图形如下

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人