设计模式 - 组合模式

概述

组合模式(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 @   贾光辉  阅读(17)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示