组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式, 它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系, 使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。
组合模式一般用来描述整体与部分的关系,它将对象组织到树形结构中,顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点,树形结构图如下。

组合模式是一种用于表示部分-整体层次结构的设计模式,使得客户端对单个对象和复合对象的使用具有一致性。换句话说,组合模式允许你将对象组合成树形结构,并且能像单个对象一样使用它们。
举个例子,假设我们要创建一个文件系统的模型。我们可以有文件夹(包含其他文件或文件夹)和文件。文件夹可以包含文件和其他文件夹,形成一个树形结构。我们希望能够统一处理文件和文件夹,比如打印它们的名字。
下面是使用C#实现组合模式的例子:
using System;
using System.Collections.Generic;
namespace CompositePatternExample
{
// 组件接口
public interface IComponent
{
void PrintName();
}
// 叶节点,实现组件接口
public class File : IComponent
{
public string Name { get; set; }
public File(string name)
{
Name = name;
}
public void PrintName()
{
Console.WriteLine($"File: {Name}");
}
}
// 复合组件,包含子组件集合
public class Folder : IComponent
{
public string Name { get; set; }
public List<IComponent> Children { get; set; }
public Folder(string name)
{
Name = name;
Children = new List<IComponent>();
}
public void Add(IComponent component)
{
Children.Add(component);
}
public void PrintName()
{
Console.WriteLine($"Folder: {Name}");
foreach (var child in Children)
{
child.PrintName(); // 递归调用子组件的PrintName方法
}
}
}
}使用示例:
class Program
{
static void Main(string[] args)
{
// 创建文件夹和文件对象
Folder rootFolder = new Folder("Root");
Folder subFolder1 = new Folder("SubFolder1");
Folder subFolder2 = new Folder("SubFolder2");
File file1 = new File("File1");
File file2 = new File("File2");
File file3 = new File("File3");
// 将文件和文件夹添加到树形结构中
rootFolder.Add(subFolder1);
rootFolder.Add(subFolder2);
subFolder1.Add(file1);
subFolder1.Add(file2);
subFolder2.Add(file3);
// 打印文件和文件夹的名字(递归)
rootFolder.PrintName(); // 输出: Folder: Root, Folder: SubFolder1, File: File1, File: File2, Folder: SubFolder2, File: File3
}
}输出结果如下:
Folder: Root Folder: SubFolder1 File: File1 File: File2 Folder: SubFolder2 File: File3
这个输出结果表示了文件夹和文件的树形结构,并按照层次打印了它们的名字。首先打印根文件夹 "Root",然后打印其子文件夹 "SubFolder1" 和 "SubFolder2"。接着,打印 "SubFolder1" 中的文件 "File1" 和 "File2",最后打印 "SubFolder2" 中的文件 "File3"。


少有人走的路


















