组合(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"。

