
设计模式(十一)—— 组合模式
发布日期:2021-05-10 04:59:24
浏览次数:22
分类:精选文章
本文共 3346 字,大约阅读时间需要 11 分钟。
组合模式:结构与实现分析
在软件开发中,结构型设计模式中有一种重要的模式——组合模式(Composite Pattern)。这种模式用于处理部分-整体关系,帮助我们将对象组织为树形结构。无论是文件系统的文件与文件夹,还是窗体程序中的控件与容器,组合模式都能通过统一接口和行为简化操作,让开发者无需关心对象的深浅层次。
组合模式的定义
组合模式定义了一种整体与部分的关系,通过树形结构将对象组合成层次化的体系。它的主要优势在于提供一致的操作接口,让无论是单个对象还是整个组合都能以统一方式进行操作。此外,组合模式在两种类型下的实现方式:透明式和安全式,确保了代码的灵活性和安全性。
组合模式的结构
组合模式包含三个主要角色:
抽象构件 (Component):为树叶和树枝声明公共接口,实现默认行为。它是树形结构中的顶层抽象。
树叶构件 (Leaf):在树形结构中,叶子节点没有子节点,只实现抽象构件接口。
树枝构件 (Composite):作为树形结构的中间节点,负责管理和存储子节点。通过add、remove等方法操作子节点。
树形结构说明
在组合模式中,所有节点都是通过统一的接口进行操作的。树形结构的根节点为顶层组件,而树枝节点和叶子节点按照同一接口实现。这样,无论是质Cooldown leaf还是复合组件,都能被统一处理,极大简化了客户端代码的复杂性。
透明式组合模式实现
// 抽象构件接口interface Component { void add(Component c); void remove(Component c); Component getChild(int i); void operation();}// 树叶构件实现class Leaf implements Component { private String name; public Leaf(String name) { this.name = name; } public void add(Component c) { // 空实现 } public void remove(Component c) { // 空实现 } public Component getChild(int i) { return null; } public void operation() { System.out.println("树叶" + name + ":被访问!"); }}// 树枝构件实现class Composite implements Component { private ArrayListchildren = new ArrayList<>(); public void add(Component c) { children.add(c); } public void remove(Component c) { children.remove(c); } public Component getChild(int i) { return children.get(i); } public void operation() { for (Component component : children) { component.operation(); } }}// 客户端代码示例public class ClientMain { public static void main(String[] args) { // 创建树枝组件 Component root = new Composite(); Component child1 = new Composite(); Component leaf1 = new Leaf("叶子1"); Component leaf2 = new Leaf("叶子2"); // 按照顺序添加子节点 root.add(leaf1); root.add(child1); child1.add(leaf2); child1.add(leaf2); root.operation(); }}
安全式组合模式实现
在安全式组合模式中,我们选择将子节点管理的操作只在树枝构件中实现,这样叶子节点就不需要提供这些方法,从而提高安全性。
interface Component { void operation();}// 树枝构件实现class Composite implements Component { private ArrayListchildren = new ArrayList<>(); public void add(Component c) { children.add(c); } public void remove(Component c) { children.remove(c); } public Component getChild(int i) { return children.get(i); } public void operation() { for (Component component : children) { component.operation(); } }}// 树叶构件实现class Leaf implements Component { private String name; public Leaf(String name) { this.name = name; } public void operation() { System.out.println("树叶" + name + ":被访问!)"); }}// 客户端代码示例public class ClientMain { public static void main(String[] args) { // 创建树枝组件 Composite root = new Composite(); Composite child1 = new Composite(); Leaf leaf1 = new Leaf("叶子1"); Leaf leaf2 = new Leaf("叶子2"); // 添加子节点 root.add(leaf1); root.add(child1); child1.add(leaf2); child1.add(leaf2); root.operation(); }}
总结
组合模式通过树形结构的层次化管理,简化了处理单个对象和复合对象的复杂性。无论是透明式还是安全式实现,它都能为开发者提供灵活且安全的操作方式。这门模式在文件系统、UI 组件以及复杂系统的建模中都展现出显著优势。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月09日 01时47分41秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MicroJob 任务注册中心添加 Nacos 支持,升级 0.0.3 版本
2025-04-14
Microsoft Access 详解-chatgpt4o作答
2025-04-14
Microsoft AI-System 开源项目教程
2025-04-14
Microsoft Project Acoustics 开源项目教程
2025-04-14
Microsoft Security Updates API 使用教程
2025-04-14
Microsoft SQL Server 2000收缩MDF数据
2025-04-14
Microsoft SQL Server 2005 提供了一些工具来监控数据库
2025-04-14
Microsoft Store 里面应用没有获取和安装按钮,无法安装应用 怎么办?
2025-04-14
Microsoft Windows XP SP3安装测试手记
2025-04-14
Microsoft.CSharp.targets不存在解决方法
2025-04-14
Microsoft语音识别定制培训
2025-04-14
MIF格式详解,javascript加载导出 MIF文件示例
2025-04-14
Miller rabin
2025-04-14
miller-rabin matlab,Miller-Rabin素数判断算法
2025-04-14
mime类型大全 input file accept
2025-04-14
Mimikatz2.2 如何抓取Win11登录明文密码
2025-04-14
mina1.7
2025-04-14