一、组合模式概述

1.定义:
组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

2.例子:

3.分析:
在树形目录结构中,包含文件和文件夹两类不同的元素。
在文件夹中可以包含文件,还可以继续包含子文件夹,在文件中不能再包含子文件或者子文件夹。
文件夹 —>容器(Container)
文件 —>叶子(Leaf)

4.理解:
一致地对待容器对象和叶子对象。
当容器对象的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理
由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下客户端希望一致地处理它们,因为对于这些对象的区别对待将会使程序非常复杂

5.结构:
组合模式包含以下3个角色:Component(抽象构件)、Leaf(叶子构件)、Composite(容器构件)

二、组合模式适用环境

1.在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们
2.在一个使用面向对象语言开发的系统中需要处理一个树形结构
3.在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型

三、组合模式案例

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

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

package composite;/*** 抽象文件类,充当抽象构件类*/
public abstract class AbstractFile {public abstract void add(AbstractFile file); //添加元素public abstract void remove(AbstractFile file); //删除元素public abstract void killVirus(); //模拟杀毒
}
package composite;import java.util.ArrayList;/*** 文件夹类,充当容器构件类*/
public class Folder extends AbstractFile {//定义一个fileList的集合,用来存储AbstractFile类型的成员private ArrayList<AbstractFile> fileList = new ArrayList<>();private String name; //定义文件夹名//无参构造public Folder() {}//有参构造public Folder(String name) {this.name = name;}@Overridepublic void add(AbstractFile file) {fileList.add(file);}@Overridepublic void remove(AbstractFile file) {fileList.remove(file);}@Overridepublic void killVirus() {System.out.println("系统正在对‘" + name + "’进行杀毒");//利用foreach循环对fileList集合里的所有元素进行杀毒for (AbstractFile abstractFile : fileList) {abstractFile.killVirus();}}
}
package composite;/*** 图像文件类,充当叶子构件类*/
public class ImageFile extends AbstractFile {private String name; //定义文件名//无参构造public ImageFile() {}//有参构造public ImageFile(String name) {this.name = name;}@Overridepublic void add(AbstractFile file) {System.out.println("对不起,不支持该方法!");}@Overridepublic void remove(AbstractFile file) {System.out.println("对不起,不支持该方法!");}@Overridepublic void killVirus() {System.out.println("系统正在对‘" + name + "’进行图像杀毒");}
}
package composite;/*** 文本文件类,充当叶子构件类*/
public class TextFile extends AbstractFile {private String name; //定义文件名//无参构造public TextFile() {}//有参构造public TextFile(String name) {this.name = name;}@Overridepublic void add(AbstractFile file) {System.out.println("对不起,不支持该方法!");}@Overridepublic void remove(AbstractFile file) {System.out.println("对不起,不支持该方法!");}@Overridepublic void killVirus() {System.out.println("系统正在对‘" + name + "’进行文本杀毒");}
}
package composite;/*** 客服端测试类*/
public class Client {public static void main(String[] args) {/*1.创建对象*///创建文件夹对象AbstractFile folder = new Folder("Bei-Zhen的资料");//创建子文件夹对象AbstractFile subfolder1 = new Folder("图像文件夹");AbstractFile subfolder2 = new Folder("文本文件夹");//创建文件对象(图像文件或文本文件)AbstractFile file1 = new ImageFile("百度登录流程图.jpg");AbstractFile file2 = new ImageFile("猜拳流程图.png");AbstractFile file3 = new TextFile("设计模式.txt");AbstractFile file4 = new TextFile("面向对象基础.doc");/*2.向集合中添加元素*///把文件添加到相对应的子文件夹中subfolder1.add(file1);subfolder1.add(file2);subfolder2.add(file3);subfolder2.add(file4);//把子文件夹添加到文件夹中folder.add(subfolder1);folder.add(subfolder2);/*3.对文件夹杀毒*/System.out.println("---------------杀毒软件--------------------");System.out.println("------文件夹杀毒开始,正在闪电杀毒-----------");folder.killVirus();System.out.println("------文件夹杀毒完成,感谢你的使用-----------");System.out.println();/*4.对指定文件杀毒*/System.out.println("------指定文件杀毒开始,正在闪电杀毒---------");file1.killVirus();System.out.println("------指定文件杀毒完成,感谢你的使用---------");}
}

4.代码运行截图:

四、组合模式优缺点

1.优点:
(1)可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,让客户端忽略了层次的差异,方便对整个层次结构进行控制
(2)客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码
(3)增加新的容器构件和叶子构件都很方便,符合开闭原则
(4)为树形结构的面向对象实现提供了一种灵活的解决方案
2.缺点:
在增加新构件时很难对容器中的构件类型进行限制

“部分-整体“——组合模式相关推荐

  1. 梳理公司的组织架构 --- 组合模式

    题外话 本来是周更的频率, 因为真实的"小光"真实地逃离了北京, 回了武汉, 回了老家, 处理了一些私人事务. 也就有快一个月时间没有更新了, 抱歉. 年终总结也都没有时间写, 抽 ...

  2. 设计模式——组合模式(部分整体模式)

    开始介绍之前,先分析一个实例: 编写一个程序展示一个学校院系结构,需要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系:如下: ------**大学**-------- ---- ...

  3. 组合模式(部分整体模式)—结构型

    创建型 1,单例设计模式 2,工厂设计模式 3,建造者设计模式 4,原型设计模式 结构型 5,代理设计模式 6,桥接设计模式 7,装饰设计模式 8,适配器设计模式 9,外观设计模式 10,享元设计模式 ...

  4. (结构型)12、组合模式(部分即整体)

    组合模式 组合模式在定义类的时候就算是组合了,几乎无处不在,组合模式可以组合单一对象,也可以组合不同对象 在设计模式的总则中有一句话:"少用继承,多用组合.聚合的方式实现解耦" 单 ...

  5. 设计模式笔记(9)---组合模式(结构型)

    Gof定义 将对象组合成树形结构以表示"部分--整体"的层次结构.Composite使得用户对单个对象和组合对象使用具有一致性. 在面向对象系统中,我们经常会遇到一类具有" ...

  6. 设计模式之组合模式(Composite)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 设计模式----组合模式UML和实现代码

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是组合模式? 组合模式(Composite)定义:将对象组合成树形结构以表示'部分---整体'的层次结构.组合模式使得 ...

  8. 20Composite(组合)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.数据结构模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用.这时候将这些特定数据结构封 ...

  9. PHP设计模式之组合模式(Composite Pattern)

    组合模式是一系列对象组合成树形结构来表示整体和部分之间的关系,组合模式的主要目的是达到,访问组合对象和访问单个对象具有一致性. 这里的组合对象比较特殊,本身可以是由其他的对象组合而成,同事,这个组合对 ...

最新文章

  1. 再见中台,你好!企业数字化转型
  2. 病毒周报(100111至100117)
  3. CG-CTF-Web-bypass again
  4. python数据结构-栈和队列的实现
  5. mie散射理论方程_电磁散射工程应用基础
  6. Linux 服务器安全加固 10条建议
  7. 国内一些SCM相关论坛站点
  8. ubuntu samba配置
  9. bug人生--状态在编程中的使用
  10. VMWARE ESXI 6.5U1离线补丁包升级教程
  11. 视频播放控制:防盗链设置与视频加密及Android中的基础应用
  12. tomcat php centeros,linux(center OS7)安装JDK、tomcat、mysql 搭建java web项目运行环境...
  13. 第一次参加pub的地面聚会
  14. 以下python语言关键字在异常处理_python后端开发工程师考证试题
  15. 一次惨痛的线下机房上云的经历
  16. 转来的,激励激励自己
  17. java oxygen下载_Eclipse 下载 安装 (Oxygen版本)
  18. MBR磁盘和GPT磁盘的基本磁盘和动态磁盘,FAT和NTFS文件系统——小结
  19. android gps nmea,读取Android GPS NMEA数据
  20. 当安全遇上AI 阿里聚安全算法挑战赛 队伍经验分享

热门文章

  1. 数据流程图中的几种循环画法
  2. intellij idea中插件的安装方法及推荐
  3. 幕课在线办公项目笔记——day1
  4. Angular 脚手架
  5. tomcat启动(一)
  6. CODOSYS之结构化文本(ST)—— 初级篇(三)基础-数据类型
  7. 我是如何从JAVA转到运维又转回java工程师的?
  8. 刷爆网络的动态条形图,3行Python代码就能搞定
  9. 如何使用Python实现图像文字识别OCR
  10. 跨境电商财务管理难的原因总结以及该如何解决