设计模式 - 组合模式
1.设计模式 - 工厂模式2.设计模式 - 抽象工厂模式3.设计模式 - 单例模式4.设计模式 - 建造者模式5.设计模式 - 原型模式6.设计模式 - 适配器模式7.设计模式 - 桥接模式
8.设计模式 - 组合模式
9.设计模式 - 装饰模式10.设计模式 - 外观模式11.设计模式 - 享元模式12.设计模式 - 代理模式13.设计模式 - 责任链模式14.设计模式 - 命令模式15.设计模式 - 解释器模式16.设计模式 - 迭代器模式17.设计模式 - 中介者模式18.设计模式 - 备忘录模式19.设计模式 - 观察者模式20.设计模式 - 状态模式21.设计模式 - 策略模式22.设计模式 - 模板方法模式23.设计模式 - 访问者模式24.设计模式合集概述
组合模式(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("");
}
}
应用场景
组合模式适用于以下场景:
- 当你希望表示对象的部分-整体层次结构时。
- 当你希望客户忽略组合对象与单个对象的不同,客户将统一地使用组合结构中的所有对象时。
优缺点
优点
- 简化客户端代码:组合模式使得客户可以一致地处理单个对象和组合对象,从而简化了客户端代码。
- 更容易扩展:通过增加新的叶子节点和组合节点,可以很容易地扩展组合结构。
缺点
- 可能导致设计过于复杂:如果组合结构过于复杂,可能会导致系统设计变得过于复杂。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库