DeepSeek + ArgoCD + Flux v2混合GitOps架构实测对比:吞吐量提升3.8倍、部署失败率降至0.07%的终极选型决策树
2026/5/15 17:30:54
组合模式(Composite Pattern),是一种结构型设计模式,这种模式将对象组合成树形结构,以表示部分--整体的层次关系,组合模式使得用户对单个对象和组合对象的使用具有一致性。
| 角色 | 说明 |
|---|---|
| Component | 抽象组件,定义叶子和容器的公共接口 |
| Leaf | 叶子节点,实现 Component 的具体行为(如 File) |
| Composite | 容器节点,持有子组件列表,实现 Component 并提供 add/remove 等管理方法(如 Folder) |
FileSystemItempublic abstract class FileSystemItem { protected String name; public FileSystemItem(String name) { this.name = name; } /** * 显示文件或目录的信息 * @param indent 缩进级别,用于显示层级结构 */ public abstract void display(int indent); /** * 获取文件或目录的大小 * @return 文件或目录的大小(字节) */ public abstract long getSize(); // 工具方法:生成缩进 protected String getIndent(int level) { return " ".repeat(level); } }Filepublic class File extends FileSystemItem { private long size; public File(String name, long size) { super(name); this.size = size; } /** * 显示文件或目录的信息 * * @param indent 缩进级别,用于显示层级结构 */ @Override public void display(int indent) { System.out.println(getIndent(indent) + "📄 " + name + " (" + size + "KB)"); } /** * 获取文件或目录的大小 * * @return 文件或目录的大小(字节) */ @Override public long getSize() { return size; } }Folderpublic class Folder extends FileSystemItem { private List<FileSystemItem> children = new ArrayList<>(); public Folder(String name) { super(name); } /** * 显示文件或目录的信息 * * @param indent 缩进级别,用于显示层级结构 */ @Override public void display(int indent) { System.out.println(getIndent(indent) + "📁 " + name); for (FileSystemItem child : children) { child.display(indent + 1); // 递归显示子项 } } // 管理子组件的方法(仅 Composite 需要) public void add(FileSystemItem item) { children.add(item); } public void remove(FileSystemItem item) { children.remove(item); } public List<FileSystemItem> getChildren() { return Collections.unmodifiableList(children); } /** * 获取文件或目录的大小 * * @return 文件或目录的大小(字节) */ @Override public long getSize() { return children.stream() .mapToLong(FileSystemItem::getSize) .sum(); } }public class CompositeDemo { public static void main(String[] args) { // 构建树形结构 Folder project = new Folder("MyProject"); Folder docs = new Folder("docs"); docs.add(new File("requirements.md", 10)); docs.add(new File("design.png", 500)); Folder src = new Folder("src"); src.add(new File("Main.java", 20)); src.add(new File("Utils.java", 15)); project.add(docs); project.add(src); project.add(new File("README.md", 5)); // 统一操作!无需区分 File 或 Folder project.display(0); System.out.println("\n总大小: " + project.getSize() + " KB"); } }两种组合模式变体
| 类型 | 特点 | 优缺点 |
|---|---|---|
| 透明式(Transparent) | Component 接口中声明所有方法(包括add,remove) | 客户端完全透明,但 Leaf 必须抛出UnsupportedOperationException |
| 安全式(Safe) | 只在 Composite 中定义管理子节点的方法 | 类型安全,但客户端需知道对象是否为 Composite(如需调用add) |
我们上面的例子采用的是安全式,更符合 Java 的类型安全理念。
Container和Component组合模式通过抽象出统一的行为接口,巧妙地将“个体”与“整体”统一处理,极大提升了代码的可读性、可维护性和可扩展性。