Java设计模式 —— 组合模式
11 组合模式
11.1 组合模式概述
Composite Pattern: 组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式使得客户端可以统一处理单个对象和组合对象。
组合模式关注那些包含叶子构件和容器构件的结构以及它们的组织形式,在叶子构件中不包含成员对象,而容器构建中可以包含成员对象,这些对象通过递归组合构成一个树形结构。组合模式为叶子构件和容器构件提供一个公共的抽象类,客户端可以针对抽象类编程,而无须关心操作的是叶子构件还是容器构件。
组合模式结构图如下所示:

需要注意的是虽然这个设计模式叫做组合模式,但容器构件和抽象构件之间是聚合关系,不要混淆啦。
11.2 组合模式实现
11.2.1 抽象构件类
它可以是接口或抽象类,为叶子构件和容器构件对象声明方法。
public abstract class Component {
public abstract void operation();
public void add(Component c) {
// 默认实现,抛出异常
}
public remove(Component c) {
// 默认实现,抛出异常
}
public Component getChild(int i) {
// 默认实现,抛出异常
return null;
}
}
11.2.2 叶子构件类
叶子构件没有子构件,它只实现了抽象构件中的 operation() 方法。
public class Leaf extends Component {
public void operation() {
// 叶子构件业务逻辑实现
}
}
11.2.3 容器构件类
容器构件包含子构件,其子构件可以是容器或叶子构件,它提供一个集合用于存储子构件。
public class Container extends Component {
private List<Component> list = new ArrayList<Component>();
public void add(Component c) {
list.add(c);
}
public void remove(Component c) {
list.remove(c);
}
public Component getChild(int i) {
return (Component)list.get(i);
}
public void operation() {
// 容器构件业务逻辑,递归执行,调用其中叶子节点的 operation 方法
for (Component c : list) {
c.operation();
}
}
}
11.3 透明组合模式
上述例子就是一个透明组合模式,叶子对象和容器对象所提供的方法是一致的,客户端可以完全同等的对待所有的对象。
但这种方式的缺点就是不够安全,因为叶子节点和容器节点是有本质上的区别的。叶子对象不会有子结构,不会包含成员对象,因此为其提供 add() 等方法是无意义的。
11.4 安全组合模式
安全组合模式结构图如下所示:

与透明组合模式相比,抽象构件 Component 中不再声明用于管理成员对象的方法,而是在容器构件 Container 中声明并实现。
安全组合模式的缺点就是不够透明,客户端无法同等对待叶子构件和容器构件。容器构件中那些管理成员对象的方法没有在抽象构件类定义,无法完全针对抽象类编程,必须区别的对待叶子构件和容器构件。
11.5 组合模式优/缺点
组合模式的应用例子:界面控件GUI
组合模式的优点主要如下:
- 新增容器构件和叶子构件都无须修改原有代码,符合开闭原则
- 客户端可以一致的使用容器构件和叶子构件,无须关系处理的单个对象还是容器对象,简化客户端代码
- 为树形结构的问题提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合可以形成复杂的树形结构,但对树形结构的操作却非常简单
组合模式的缺点主要如下:
- 很难对容器中的构件类型进行限制,因为所有的叶子构件都来自相同的抽象层,只能通过运行时进行类型检查来实现,这个过程较为复杂
Java设计模式 —— 组合模式的更多相关文章
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- 【设计模式】Java设计模式 - 组合模式
Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- JAVA 设计模式 组合模式
用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构
- Java 设计模式 —— 组合模式
在现实生活中,存在很多"部分-整体"的关系,例如,大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.生活用品中的衣服与衣柜.以及厨房中的锅碗瓢盆等.在软件开发中也是 ...
- Java设计模式—组合模式
组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系. 个人理解:组合模式就是将部分组装成整体. 定义如下: 将对象组合成树形结构以表 ...
- Java设计模式-组合模式(Composite)
组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便,看看关系图: 直接来看代码: public class TreeNode { private String name; private ...
- Java设计模式----组合模式(Composit )
1. 组合模式定义: 组合模式,又叫合成模式,有时又叫部分-整体模式,主要用来描述部分与整体的关系. 定义:将对象组合成树形结构以示" 部分--整体 "的层次结构,使得用户对单个 ...
- Java设计模式---组合模式
一.组合模式定义 组合模式定义: Compose objects into tree structures to represent part-whole hierarchies. Composite ...
- 3.java设计模式-建造者模式
Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...
- 16. 星际争霸之php设计模式--组合模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
随机推荐
- 01. JavaScript基础知识
一.JavaScript简介 JavaScript 是一门解释型编程语言,解释型编程语言指代码不需要手动编译,而是通过解释器边解释边执行.所以,要运行 JS,我们需要在计算机中安装 JS 的解释器 ...
- 更多Linux实用命令
更多实用命令 进程相关 当程序运行在系统上时,我们称之为进程(process).想监测这些进程,需要熟悉 ps/top 等命令的用法.ps 命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的许 ...
- 模拟法NOIP题单
模拟算法的试题训练, 重点针对试题分析环节的练习锻炼!! 考察阅读能力.分析能力.建模能力! 模拟法题目是最基础的题目,她不难,她复杂,她的实现往往需要足够的细心耐心! 练习这类题目能够使你掌握其他算 ...
- 【C++小程序】《我要抽签》b1.0做好了~
也许是的,得横空出世了 如你所见 这款基于\(C++\)能模仿Mrs. Yao抽签系统的cpp终于做完了啦~ 初期功能很少.\(BUG\)极多. 所以为了您的体验:) 请遵守格式 代码: #inclu ...
- Linux系列(8)-添加用户并设置密码
#添加用户[root@iZm5ehnt0e8indgne1hibuZ ~]# useradd -m linsiyu #设置用户密码[root@iZm5ehnt0e8indgne1hibuZ ~]# p ...
- python C# DES 加密转换
import time import base64 import pyDes import binascii def DESEncrypt(desKey, target): key = desKey[ ...
- Python之常用数据类型详解
tuple 元组 1 # 定义 2 temp = (2, ) # 规范定义,单个元素的元组 3 tem = 2, # 可行,但不规范定义 4 tep = () # 空元组 5 6 tp = (1, ' ...
- 几种C#实现播放声音的方法 DirectX、SoundPlayer等
第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll 和 Microsoft.Directx.DirectSou ...
- Java基础学习——复利计算
面对一个问题的时候,首先应该确定问题中存在多少参数,对每个参数进行定义.并知晓所写代码目标.思路清晰,
- git merge的原理
当我我们拉去代码合并到master的另一个分支上面去的时候 只是对比当前分支commit的修改与增加的代码,其他代码以master为主.