不懂使用为学过,说出用途,绘制结构为了解,不会灵活使用基本等于没学。

前言

树形结构在软件中随处可见,比如系统中的目录结构,应用软件中的菜单,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题。组合模式通过一种巧妙的设计方案来使得用户可以一致性的处理整个树形结构或者树形结构的一部分,也可以一致的处理树形结构中的叶子节点。

什么是组合模式  Composite Pattern

组合多个对象形成树形结构以表示具有"整体-部门"关系的层次结构。组合模式对单个对象(叶子对象)和组合对象(容器对象)的使用具有一致性,所有又被称之为"整体-部分"模式,它是一种结构性模式

组合模式的优点

(1)、可以清楚的定义分层次的复杂对象,表示对象的全部或部分层次,她让客户端忽略了层次的差异,方便对于整个层次结构进行控制

(2)、客户端可以一致的使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整体组合结构,简化了客户端代码

(3)、组合模式中增加了新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合开闭原则

(4)、组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。

组合模式的缺点

在增加新构件时很难对容器中的构件类型进行限制。有时候希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程就比较复杂

组合模式的使用场景

(1)、具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致的对待它们。

(2)、在一个使用面向对象语言开发的系统中需要处理一个树形结构。

(3)、在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。

组合模式的具体实现

项目结构

抽象构件

package com.company;//抽象文件类:抽象构件
public abstract class AbstractFile {public abstract void add(AbstractFile file);public abstract void remove(AbstractFile file);public abstract AbstractFile getChild(int i);public abstract void killVirus();
}

容器构件

package com.company;import java.util.ArrayList;//文件夹类:容器构件
public class Folder extends AbstractFile {//定义集合fileList,用于存储AbstractFile类型的成员private ArrayList<AbstractFile> fileList=new ArrayList<AbstractFile>();private String name;public Folder(String name) {this.name = name;}@Overridepublic void add(AbstractFile file) {fileList.add(file);}@Overridepublic void remove(AbstractFile file) {fileList.remove(file);}@Overridepublic AbstractFile getChild(int i) {return (AbstractFile) fileList.get(i);}@Overridepublic void killVirus() {System.out.println("********对文件夹*********"+name+"进行杀毒");  //模拟杀毒//递归调用成员构件的killVirus()方法for(Object obj:fileList){((AbstractFile)obj).killVirus();}
}}

叶子构件

package com.company.file;import com.company.AbstractFile;//图像文件类:叶子构件
public class ImageFile extends AbstractFile {private String name;public ImageFile(String name) {this.name = name;}@Overridepublic void add(AbstractFile file) {System.out.println("对不起,不支持该方法!");}@Overridepublic void remove(AbstractFile file) {System.out.println("对不起,不支持该方法!");}@Overridepublic AbstractFile getChild(int i) {System.out.println("对不起,不支持该方法!");return null;}@Overridepublic void killVirus() {//模拟杀毒System.out.println("-------对图像文件-----------"+name+"进行杀毒");}
}
package com.company.file;import com.company.AbstractFile;public class TextFile extends AbstractFile {private String name;public TextFile(String name) {this.name = name;}@Overridepublic void add(AbstractFile file) {System.out.println("对不起,不支持该方法!");}@Overridepublic void remove(AbstractFile file) {System.out.println("对不起,不支持该方法!");}@Overridepublic AbstractFile getChild(int i) {System.out.println("对不起,不支持该方法!");return null;}@Overridepublic void killVirus() {//模拟杀毒System.out.println("-------对文本文件-----------"+name+"进行杀毒");}
}

测试类

package com.company;import com.company.file.ImageFile;public class Client {public static void main(String[] args) {// write your code here//针对抽象构件编程AbstractFile file1,file2,file3,file4,folder1,folder2,folder3,folder4;folder1=new Folder("Sunny的资料");folder2=new Folder("图像文件");folder3=new Folder("文本文件");folder4=new Folder("视频文件");file1=new ImageFile("小龙女.jpg");file2=new ImageFile("张无忌.gif");file3=new ImageFile("九阴真经.txt");file4=new ImageFile("葵花宝典.doc");folder1.add(file1);folder2.add(file2);folder3.add(file3);folder4.add(file4);//从"Sunny的资料"节点开始进行杀毒folder1.killVirus();folder2.killVirus();folder3.killVirus();folder4.killVirus();}
}

转载请注明出处,掌声送给社会人

设计模式的艺术 结构性模式之组合模式相关推荐

  1. 设计模式C++实现(7)——外观模式、组合模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  2. 设计模式学习笔记(十一)-组合模式

    树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得 ...

  3. 7、大话设计模式--状态模式 、适配器模式、备忘录模式、组合模式、迭代器模式

    第十六章:无尽加班何时休--状态模式 状态模式 :   优点: 缺点: 所使用的项目是:工作状态 功能: 界面: 设计思路: 收获: 附: 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出 ...

  4. 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)

    一.适配器模式(类适配器.对象适配器.接口适配器) 1.现实生活中的例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了国内的电器了. 2.基本介绍 适配器模式(Ad ...

  5. 设计模式之结构型模式:适配器模式、桥接模式、组合模式、装饰器模式、代理模式、

    文章目录 什么是结构型模式 适配模式 适配器的数据结构 适配器的实现 缺省适配器 适配器优缺点 适配器模式的使用环境 桥接模式 桥接模式数据结构 桥接模式的实现 桥接模式和适配器模式的联用 桥接模式的 ...

  6. 设计模式-外观模式与组合模式

    1. 外观模式 顾名思义,外观模式就是说将这个类的内部执行流程都进行了封装,程序员只能够"外部"接口进行操作,而具体的执行过程并不可见.比如我们写的C++代码在生成可执行文件的过程 ...

  7. 设计模式学习笔记(7)——外观模式、组合模式

    外观模式定义:为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 云里雾里,看代码 class Scanner { public:void Sca ...

  8. 迭代器模式和组合模式混用

    迭代器模式和组合模式混用 前言 园子里说设计模式的文章算得上是海量了,所以本篇文章所用到的迭代器设计模式和组合模式不提供原理解析,有兴趣的朋友可以到一些前辈的设计模式文章上学学,很多很有意思的.在He ...

  9. 组合模式——透明组合模式,安全组合模式

    组合模式 概述 叶子节点进行相关的操作. 可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象. 但是由于容器对象和叶子对象在功能上面的区别,使得我们 ...

  10. 6-设计模式之结构型模式(桥接模式、外观模式、组合模式、享元模式)

    设计模式之结构型模式二(桥接模式.外观模式.组合模式.享元模式) 5.4 桥接模式 5.4.1 概述 5.4.2 结构 5.4.3 案例 5.4.4 使用场景 5.5 外观模式 5.5.1 概述 5. ...

最新文章

  1. 不是计算机专业学python能找到工作吗-非计算机行业为什么要转行学习Python编程...
  2. python 等待其他线程执行完_面试官:如何让线程顺序执行,join,还有其他办法吗?...
  3. 使用计算机教学的意义,信息技术对教学的意义
  4. 御剑仙侠服务器维护,御剑修仙放置挂机文字游戏
  5. 计算机机房检查内容,IDC数据中心机房日常运维巡检工作的正确姿势
  6. 年会抽奖 - 牛客网题解
  7. English——让步状语从句(一般现在时表将来)(三)
  8. 基于J2EE的线上打印平台
  9. 软件测试中一般术语的的英文缩写
  10. 在Python中使用OpenCV进行直线检测
  11. RH358管理DHCP和IP地址分配--配置分配IPv6地址
  12. 得不偿失!博士骗领210万元、硕士骗领3万元人才补贴,全被判刑了!
  13. 版本控制:集中式VS分布式了解它们的运行方式
  14. Hive 如何划分 Stage【转载】
  15. 拿到华为200万年薪的8个人到底是何方神圣?为什么有人反而不屑?
  16. 13年android手机top,2013年12月热门Android机型盘点
  17. 亚马逊买家号白号批量注册怎么做?
  18. 新浪邮箱SMTP开启
  19. 抢滩登陆游戏android源码
  20. windows和android调用第三方C++库(静态库lib、动态库dll)

热门文章

  1. 【LaTex】 Font “FandolSong-Regular“ does not contain requested(fontspec)Script “CJK“.如何抑制此种警告?
  2. visio画图复制粘贴到word_Visio 2010怎么复制图片 Visio粘贴图形到其它office程序
  3. 【GA MTSP】基于matlab遗传算法求解多旅行商问题(同始终点)【含Matlab源码 1338期】
  4. 12C RAC重装无法识别磁盘组(AFD新特性)
  5. xbox微软服务器崩溃了,微软的Xbox游戏条因0x803F8001错误而崩溃
  6. chm文件打开空白或显示不全
  7. android登录功能实现代码,功能强大的登录界面Android实现代码
  8. matlab有限域多项式除法_第四章多项式和有限域.ppt
  9. F-Train Wreck_2021牛客暑期多校训练营10
  10. 网络冗余备份之浮动路由