文章目录

  • 详解Java设计模式之组合模式
    • 案例引入
    • 组合模式
      • 定义
      • 模式类图结构
        • 相关角色
        • 典型代码
      • 案例分析
        • 类图设计
        • 实例代码
        • 结果分析
      • JavaJDK中的组合模式
      • 透明组合模式
      • 安全组合模式
      • 组合模式优点
      • 组合模式缺点
      • 组合模式适用环境

详解Java设计模式之组合模式

案例引入

  • Windows的操作系统目录结构如下

  • 分析

    • 在树形目录结构中,包含文件和文件夹两类不同的元素

      • 在文件家中可以继续包含子文件夹
      • 在文件中不能在包含子文件(word中嵌入图片不是一个概念
    • 文件夹也叫作容器(Container)节点
    • 文件也叫作叶子(Leaf)节点
    • 当容器对象的某一个方法被调用时,将遍历整个属性结构,寻找包含这个方法的成员对象并调用执行,牵一而动百,其中使用了递归的机制来对整个结构进行处理
    • 由于容器节点和叶子结点在功能上的区别,在使用这些对象的代码中必须有区别的对象容器节点和叶子节点,而实际上大多数情况下客户端希望一致的处理他们,因为对于这些对象的区别对待会导致程序较为复杂(就比如说需要进行不断的判定结构)

如何一致性的对待容器对象和叶子对象呢?????再比如一个大果盘里面装有小果盘和果子,小果盘里又装着小小果盘和果子,们想要吃到所有的水果的过程也是类似的。由此我们正式引出组合模式

组合模式

定义

组合模式:组合多个对象形成树形结构表示具有整体和部分关系的层次结构。组合模式让客户端可以统一的对待单个对象和组合对象。

Composite Pattern:Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and composition of objects uniformly.

  • 组合模式属于对象结构性模式
  • 又称为"部分-整体"模式
  • 将对象组织到树形结构中,可以用来描述整体和部分的关系。
模式类图结构

相关角色
  • Component 抽象构件
  • Leaf 叶子构件
  • Composite 容器构件
典型代码
  • 抽象构件Component

    • public abstract class Component {public abstract void add(Component c); //增加成员public abstract void remove(Component c); //删除成员public abstract Component getChild(int i); //获取成员public abstract void operation();  //业务方法
      }
  • 叶子构件 Leaf

    • public class Leaf extends Component {public void add(Component c) { //异常处理或错误提示}   public void remove(Component c) { //异常处理或错误提示}public Component getChild(int i) { //异常处理或错误提示return null; }public void operation() {//叶子构件具体业务方法的实现} 
  • 容器构件

    • public class Composite extends Component {private ArrayList<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() {//容器构件具体业务方法的实现,将递归调用成员构件的业务方法for(Object obj:list) {((Component)obj).operation();}}
      }
      
案例分析

某软件公司欲开发一个杀毒(Antivirus)软件,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒。该杀毒软件还可以根据各类文件的特点,为不同类型的文件提供不同的杀毒方式,例如图像文件(ImageFile)和文本文件(TextFile)的杀毒方式就有所差异。
现使用组合模式来设计该杀毒软件的整体框架。

类图设计

实例代码

(1) AbstractFile:抽象文件类,充当抽象构件类
(2) ImageFile:图像文件类,充当叶子构件类
(3) TextFile:文本文件类,充当叶子构件类
(4) VideoFile:视频文件类,充当叶子构件类
(5) Folder:文件夹类,充当容器构件类
(6) Client:客户端测试类

具体代码和更多相关实验可见我的gitee

https://gitee.com/plushuang/HelloWord/tree/master/src/csu/edu/cn/designpattern/compositepattern/example

结果分析

见代码

  • 如果需要更换操作节点,例如只对文件夹“文本文件”进行杀毒,客户端代码只需修改一行即可
  • 在具体实现时,可以创建图形化界面让用户来选择所需操作的根节点,无须修改源代码,符合开闭原则
JavaJDK中的组合模式

透明组合模式

其实也就是在抽象构件中提供add、remove、get等方法,但是这些方法叶子节点是不能使用的,只有容器节点能够使用。不够安全,一旦叶子节点调用需要进行报错或者提示处理,但是能够让客户端一致性的对待两者

安全组合模式

也就是抽象构件中不含上述三种方法,能够保证安全性,但是导致的就是不够透明,客户端不能完全的针对抽象编程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6YQOsnst-1640067963922)(C:\Users\PlusHuang\AppData\Roaming\Typora\typora-user-images\image-20211221142113986.png)]

组合模式优点
  • 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,让客户端忽略了层次的差异,方便对整个层次结构进行控制
  • 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码
  • 增加新的容器构件和叶子构件都很方便,符合开闭原则
  • 为树形结构的面向对象实现提供了一种灵活的解决方案
组合模式缺点
  • 在增加新构件时很难对容器中的构件类型进行限制
组合模式适用环境
  • 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们
  • 在一个使用面向对象语言开发的系统中需要处理一个树形结构
  • 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型

Java设计模式之组合模式详解相关推荐

  1. 设计模式之组合模式详解(附应用举例实现)

    文章目录 1 组合模式介绍 2 组合模式详解 2.1 组合模式结构 2.2 组合模式实现 2.3 组合模式应用举例 3 透明组合模式和安全组合模式 1 组合模式介绍 在我们的树形目录结构中,包含文件和 ...

  2. java设计模式之代理模式详解

    代理模式在Java中十分常见,有如Spring实现AOP而使用动态代理,更有RPC实现中使用的调用端调用的代理服务.代理模型除了是一种设计模式之外,它更是一种思维,所以探讨并深入理解这种模型是非常有必 ...

  3. java设计模式---责任链模式详解

    深入理解什么是责任链模式 一,责任链模式 1,什么是责任链模式 二,框架中使用到的责任链模式 1,springmvc流程 2,mybatis的执行流程 3,spring的过滤器和拦截器 4,senti ...

  4. Java设计模式之工厂模式详解

    目录 1.什么是工厂模式? 2.作用: 3.核心本质: 4.详细分类: 5.简单工厂模式/静态工厂模式: 6.工厂方法模式 7.两种模式对比总结: 1.什么是工厂模式? 工厂模式的主要解决的问题是,将 ...

  5. Java设计模式之组合模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  6. 组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)

    组合模式 一.组合模式的概念和角色 (一).组合模式的概念 (二).组合模式的角色 二.组合模式的应用场景 三.透明组合模式的代码示例 四.安全组合模式的代码示例 五.组合模式的优缺点 (一).优点 ...

  7. 设计模式之模板方法模式详解

    设计模式之模板方法模式详解 概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的 ...

  8. 设计模式之门面模式详解

    设计模式之门面模式详解 文章目录 设计模式之门面模式详解 一.什么是门面模式 二.门面模式的应用场景 三.门面模式的角色组成 四.门面模式通用写法 五.门面模式在业务中的应用 六.门面模式优缺点 一. ...

  9. 设计模式之桥接模式详解

    设计模式之桥接模式详解 文章目录 设计模式之桥接模式详解 一.什么是桥接模式 二.桥接模式的应用场景 三.桥接模式的角色组成 四.桥接模式通用写法示例 五.桥接模式优缺点 一.什么是桥接模式 桥接模式 ...

最新文章

  1. entity framework 6 我写了一个公用数据类
  2. 磁盘 io 的性能指标 简介
  3. OpenCV 腐蚀和膨胀
  4. Oracle-OLAP和OLTP解读
  5. OpenVMS用户手册目录翻译
  6. uva1624knots
  7. 【计算机系统设计】重点 · 学习笔记(1)(资源消耗)
  8. GenseeSDK 使用Kotlin要注意TODOAndroid Studio关闭TODO
  9. Word vba 替换
  10. 计算机科学与技术(密码学)是什么意思,应用密码学
  11. Oracle的卸载步骤(详细图示)
  12. vue自执行函数,vue3动态组件
  13. Lavas 安装和项目构建
  14. 华硕飞行堡垒Fx50j4200H 4600HD 黑苹果High Sierra10.13.6心得
  15. canvas绘制出货单
  16. 关闭Win10锁屏的防暴力破解功能
  17. 基于SSM的网上图书商城系统
  18. 微信小程序实现旋转动画效果
  19. Openwrt pppoe demand拨号问题
  20. JVM调优专题-JVM调试工具

热门文章

  1. 两个ESP8266通过云端实现远程数据交互
  2. 架构设计:不要在一棵树上吊死
  3. linux打开img软件,linux如何打开img
  4. 人工神经网络的数学内涵,数学与神经网络的关系
  5. HTML多个视频的排版问题
  6. iMeta|中科院微生物所刘双江组发布人源毛螺菌科菌株资源库和菌株水平代谢谱...
  7. 《纳什均衡与博弈论》
  8. 微软故障转移集群服务器,故障转移群集
  9. 高效多用的群集之LVS负载均衡群集(NAT模式)
  10. 手机html丢失,手机丢了号码没了 攻略教你一分钟全找回