组合模式(Composite Pattern)
概念:
· 是一种结构型设计模式;
· 将对象组合成树形结构,表示"整体-部分"的层次关系,使客户端可以对待单一对象和对象集合;
UML结构:
Component (抽象组件) ------------------- + Operation() + Add(c) + Remove(c) + GetChild(i) | ---------------------- | | Leaf (叶子节点) Composite (组合节点) ----------------- ---------------------- + Operation() + Operation() + Add(c) + Remove(c) + GetChild(i) - children: List<Component>代码示例:
cs/// <summary> /// 文件系统抽象类 /// </summary> public abstract class IFileSystemComponent { // 以缩进形式打印目录结构 public abstract void Display(int depth); // 获取当前组件的大小 public abstract int GetSize(); } /// <summary> /// 具体文件实现类 /// </summary> public class File : IFileSystemComponent { public string Name { get; set; } public int Size { get; set; } public string FileFormat { get; set; } public File(string name, int size, string fileFormat) { this.Name = name; this.Size = size; this.FileFormat = fileFormat; } public void Display(int depth) { Console.WriteLine(new string(' ', depth * 2) + $"- {Name}.{FileFormat}({Size}KB)"); } public int GetSize() { return Size; } } /// <summary> /// 具体文件夹实现类 /// </summary> public class Directory : IFileSystemComponent { private List<IFileSystemComponent> _fileList = new(); // 文件列表 public string Name { get; set; } // 文件名称 public Directory(string name) { this.Name = name; } public void Display(int depth) { Console.WriteLine(new string(' ', depth * 2) + $"- {Name}"); foreach (IFileSystemComponent file in _fileList) { file.Display(depth + 1); } } public int GetSize() { if (_fileList.Count <= 0) return 0; int total = 0; foreach (var child in _fileList) { total += child.GetSize(); } return total; } public void Add(IFileSystemComponent component) { // 检查输入 if (component != null) return; if (_fileList != null && !_fileList.Contains(component)) { _fileList.Add(component); } } public void Remove(IFileSystemComponent component) { // 检查输入 if (component != null) return; if (_fileList != null) { _fileList.Remove(component); } } } /// <summary> /// 客户端 /// </summary> public class Client { public static void Main() { IFileSystemComponent root = new Directory("Root"); IFileSystemComponent fileA = new File("File_A", 10, ".txt"); IFileSystemComponent fileB = new File("File_B", 20, ".txt"); IFileSystemComponent fileC = new File("File_C", 30, ".txt"); IFileSystemComponent fileD = new File("File_C", 40, ".txt"); IFileSystemComponent subDir1 = new Directory("SubDir_1"); IFileSystemComponent subDir2 = new Directory("SubDir_2"); subDir2.Add(fileD); subDir1.Add(fileC); subDir1.Add(subDir2); root.Add(fileA); root.Add(fileB); root.Add(subDir1); // 打印目录树 root.Display(0); Console.WriteLine("总大小: " + root.GetSize()); } }特点:
优点:· 清晰表示树形结构 :非常适合"整体-部分"场景;
· 统一处理叶子和组合对象 :客户端无需区分,操作透明;
· 便于扩展 :增加新的叶子或组合节点无需修改客户端代码;
缺点:· 设计可能过度透明 :客户端对组合和叶子统一处理,有时需要区分,可能导致不安全操作;
· 增加系统复杂性 :树形结构和递归调用增加理解和维护难度;
适用场景:
· 系统有 "整体-部分" 层次结构;
· 需要对 单个对象和组合对象进行统一操作;
· 客户端希望忽略对象组合的层次,直接操作组件;
举例场景:
· 文件系统;
· 公司组织架构:Leaf :普通员工,Composite:部门经理(包含下属员工列表);
· GUI 组件:Leaf :按钮、文本框,Composite:面板、窗口(包含多个组件);
【设计模式】组合模式
大飞pkz2025-09-27 17:36
相关推荐
折哥的程序人生 · 物流技术专研5 小时前
第4篇:Lambda 简化策略模式(Java 8+)西门吹-禅7 小时前
java springboot N+1问题skywalk81637 小时前
设计并实现段言的 C FFI 绑定机制 @TraeIT笔记9 小时前
【Rust】Rust Match 模式匹配详解2zcode9 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统逝水无殇9 小时前
C# 运算符重载详解TPBoreas9 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)敲代码的嘎仔10 小时前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档江华森10 小时前
Python 实现高德地图找房(一):环境搭建与数据爬虫杜子不疼.10 小时前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式