概述
组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户可以统一地处理单个对象和组合对象。通过使用组合模式,客户代码可以一致地处理简单和复杂的元素,从而提高系统的灵活性和可扩展性。
结构
组合模式包含以下几个角色:
- 组件(Component):定义组合对象和叶子对象的接口。
- 叶子(Leaf):实现组件接口,表示叶子对象。
- 组合(Composite):实现组件接口,表示有子组件的组合对象,并定义子组件的管理方法。
示例代码
假设我们有一个应用程序需要表示文件系统中的文件和文件夹。
代码地址
组件接口
public interface IFileSystemComponent
{
void Display(string indent);
}
叶子
public class File : IFileSystemComponent
{
private string _name;
public File(string name)
{
_name = name;
}
public void Display(string indent)
{
Console.WriteLine($"{indent}- {_name}");
}
}
组合
public class Directory : IFileSystemComponent
{
private string _name;
private List<IFileSystemComponent> _components = new List<IFileSystemComponent>();
public Directory(string name)
{
_name = name;
}
public void Add(IFileSystemComponent component)
{
_components.Add(component);
}
public void Remove(IFileSystemComponent component)
{
_components.Remove(component);
}
public void Display(string indent)
{
Console.WriteLine($"{indent}+ {_name}");
foreach (var component in _components)
{
component.Display(indent + " ");
}
}
}
客户端代码
class Program
{
static void Main(string[] args)
{
IFileSystemComponent file1 = new File("File1.txt");
IFileSystemComponent file2 = new File("File2.txt");
IFileSystemComponent file3 = new File("File3.txt");
Directory folder1 = new Directory("Folder1");
folder1.Add(file1);
Directory folder2 = new Directory("Folder2");
folder2.Add(file2);
folder2.Add(file3);
Directory root = new Directory("Root");
root.Add(folder1);
root.Add(folder2);
root.Display("");
}
}
应用场景
组合模式适用于以下场景:
- 当你希望表示对象的部分-整体层次结构时。
- 当你希望客户忽略组合对象与单个对象的不同,客户将统一地使用组合结构中的所有对象时。
优缺点
优点
- 简化客户端代码:组合模式使得客户可以一致地处理单个对象和组合对象,从而简化了客户端代码。
- 更容易扩展:通过增加新的叶子节点和组合节点,可以很容易地扩展组合结构。
缺点
- 可能导致设计过于复杂:如果组合结构过于复杂,可能会导致系统设计变得过于复杂。