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 ...
随机推荐
- CSS 语法-熟悉样式规则
CSS 规则: CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 样式规则: 以内嵌式样式表为例: (1)所有的css代码都必须书写在<head>标签内部的一对<sty ...
- Javaheima12
Java 不可变集合 如果某个数据不能修改,把它防御性地拷贝到不可变集合红是个很好的实践 或者当集合对象被不可信的库调用时,不可变形式是安全的 创建 再List,Set,Map接口中,都存在of方法, ...
- [Leetcode 787]中转K站内最便宜机票
题目 n个城市,想求从src到dist的最廉价机票 有中转站数K的限制,即如果k=5,中转10次机票1000,中转5次机票2000,最后返回2000 There are n cities connec ...
- K8s+Docker 学习笔记系列
学前知识 你需要掌握 Linux 的常用命令.你可以通过Linux 教程 来学习相关命令. Docker应用场景 Web 应用的自动化打包和发布. 自动化测试和持续集成.发布. 在服务型环境中部署和调 ...
- RabbitMQ身份验证、授权、访问控制
原文:https://www.rabbitmq.com/access-control.html 概述 不同的用户只能访问特定的虚拟主机.他们在每个虚拟主机中的权限也可以被限制. RabbitMQ支持两 ...
- HBase架构、模型、特点
如需大数据开发整套视频(hadoop\hive\hbase\flume\sqoop\kafka\zookeeper\presto\spark):请联系QQ:1974983704 1.HBase概述 H ...
- 2020/03/24 HTML基础复习笔记
2020-03-24 15:49:30 下午好! 这是我开通博客的第二天也是在钉钉上网课的又一天,为了应对考试现在复习到了HTML基础知识,本打算用VS敲想了想还是用了XMind(真的好用!!!)文件 ...
- .Net 5.0导出Execl的两种方式
项目中经常会用到表格的导入导出今天来简绍一下我所了解的两种方式 1.拼接成表格的简单方式直接导出,服务器上不用安装其他程序 可以直接导出 public async Task<FileResult ...
- Postman设置Cookie参数为全局变量-环境变量设置IP参数
前提:在遇到多接口测试时,容易出现限制登录的情况 可以使用两种情况: 1.在调用其他接口前,先调用登录接口:这个方法在一般情况下可以,但是对于有些环境,比如像小程序登录时token(或cookie)是 ...
- python 引用传递,简单例子
from threading import Threaddef test1(a): while 1: print adef test2(a): a["a"] = 2if __nam ...