设计模式 - 组合模式

概述

组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户可以统一地处理单个对象和组合对象。通过使用组合模式,客户代码可以一致地处理简单和复杂的元素,从而提高系统的灵活性和可扩展性。

结构

组合模式包含以下几个角色:

  1. 组件(Component):定义组合对象和叶子对象的接口。
  2. 叶子(Leaf):实现组件接口,表示叶子对象。
  3. 组合(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("");
    }
}

应用场景

组合模式适用于以下场景:

  1. 当你希望表示对象的部分-整体层次结构时。
  2. 当你希望客户忽略组合对象与单个对象的不同,客户将统一地使用组合结构中的所有对象时。

优缺点

优点

  • 简化客户端代码:组合模式使得客户可以一致地处理单个对象和组合对象,从而简化了客户端代码。
  • 更容易扩展:通过增加新的叶子节点和组合节点,可以很容易地扩展组合结构。

缺点

  • 可能导致设计过于复杂:如果组合结构过于复杂,可能会导致系统设计变得过于复杂。
posted @ 2025-01-03 16:05  贾光辉  阅读(11)  评论(0编辑  收藏  举报