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设计模式 —— 组合模式的更多相关文章

  1. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  2. 【设计模式】Java设计模式 - 组合模式

    Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  3. JAVA 设计模式 组合模式

    用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构

  4. Java 设计模式 —— 组合模式

    在现实生活中,存在很多"部分-整体"的关系,例如,大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.生活用品中的衣服与衣柜.以及厨房中的锅碗瓢盆等.在软件开发中也是 ...

  5. Java设计模式—组合模式

    组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系. 个人理解:组合模式就是将部分组装成整体. 定义如下: 将对象组合成树形结构以表 ...

  6. Java设计模式-组合模式(Composite)

    组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便,看看关系图: 直接来看代码: public class TreeNode { private String name; private ...

  7. Java设计模式----组合模式(Composit )

    1.  组合模式定义: 组合模式,又叫合成模式,有时又叫部分-整体模式,主要用来描述部分与整体的关系. 定义:将对象组合成树形结构以示" 部分--整体 "的层次结构,使得用户对单个 ...

  8. Java设计模式---组合模式

    一.组合模式定义 组合模式定义: Compose objects into tree structures to represent part-whole hierarchies. Composite ...

  9. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

  10. 16. 星际争霸之php设计模式--组合模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

随机推荐

  1. 第13章 MVC和Razor Pages过滤器管道(ASP.NET Core in Action, 2nd Edition)

    本章包括 过滤器管道及其与中间件的区别 创建自定义筛选器以重构复杂的操作方法 使用授权筛选器保护您的操作方法和Razor页面 短路筛选器管道以绕过操作和页面处理程序执行 将依赖项注入筛选器 在第1部分 ...

  2. springboot项目记录3用户注册界面

    九.注册-前端页面 1.在register页面中编写发送请求的方法,采用点击事件来完成.选中对应的按钮(JQuery下的)(( " 选 择 器 " ) ) , 选 中 某 一 个 ...

  3. eclipse project is missing required java project

    eclipse project is missing required java project eclipse版本: 2022-03 这情况就是maven包出了问题 具体的说不上 看我的解决方法: ...

  4. 浙里办微信小程序总结

    浙里办微信小程序单点登录流程 1.获取浙里办跳转地址中ticket或者微信小程序中的ticketId let ticket = getQueryString("ticket", w ...

  5. SQL优化:重新编译存储过程和表

    最近发现原来执行很快的存储过程,突然慢了下来,而很多存储过程每天就运行一次,所以打算把存储过程重新编译,另外,考虑到数据在不断变化,所以也要更新表的统计信息,这样能生成比较好的执行计划. 下面是具体的 ...

  6. 搭建Angular基础项目学习

    https://stackblitz.com/借助StackBlitz网站可快速开始搭建一个angular项目 一个angular的component包含三项东西 A component class  ...

  7. ubuntu clean swap

    https://askubuntu.com/questions/1357/how-to-empty-swap-if-there-is-free-ram#:~:text=a single line-,s ...

  8. Spring AOP的动态代理原理和XML与注解配置

    AOP 实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强. 相关术语: Target(目标对象):代理的目标对象 Pr ...

  9. 5G如何加速无人快递?5G智能网关新应用

    网上购物已经是现代生活的主流消费方式之一,伴随网购的繁荣,物流快递行业也进入到一个最火热的时期.而在这之中,有限的快递配送能力和日益增长的配送需求的矛盾持续凸显,因此无人快递车一类的创新应用也应运而生 ...

  10. nginx配置https安全访问

    1.使用wosigncode生成CSR https://bbs.wosign.com/forum.php?mod=viewthread&tid=3526#lastpost 2.配置,选择第7小 ...