一、概述

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

组合模式关注那些包含叶子构件和容器构件的结构以及它们的组织形式,在叶子构件中不包含成员变量,而容器构件中可以包含成员对象,这些对象通过递归组合可构成一个树形结构。

二、结构与实现

  1. 结构:

(1)Component(抽象构件):

可以是接口或抽象类,为叶子构件及容器构件提供共有行为的声明。抽象构件中定义了访问及管理它的子构件的方法,如:新增、删除、获取子构件。

(2)Leaf(叶子构件):

实现抽象构件中定义的行为。无子节点。

(3)Composite(容器构件):实现抽象构件中定义的行为,包括那些访问及管理子构件的方法。容器节点包含子节点,可以是子节点,也可以是容器节点。

  1. 实现

(1)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();
}

(2)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(){//具体业务实现}
}

(3)Composite:

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();}}
}

三、应用实例

  1. 分析:

Folder充当容器构件类,ImageFile和TextFile充当叶子构件类,再抽出一个AbstractFile作为抽象构件类。

  1. 类图:

  2. 代码实现:

abstract class AbstractFile{public abstract void add(AbstractFile file);public abstract void remove(AbstractFile file);public abstract AbstractFile getChild(int i);public abstract killViris();
]//ImageFile
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+"进行查杀中...");}
}//TextFile
class TextFile extends AbstractFile{private String name;public TextFile(String name) {this.name = name;}//add,remove,getChild方法同上,此处省略@Overridepublic void killVirus() {System.out.println("对文本文件"+name+"进行查杀中...");}
}//Folder
class Folder extends AbstractFile{private String name;public Folder(String name) {this.name = name;}private ArrayList<AbstractFile> list=new ArrayList<>();@Overridepublic void add(AbstractFile file) {list.add(file);}@Overridepublic void remove(AbstractFile file) {list.remove(file);}@Overridepublic AbstractFile getChild(int i) {AbstractFile file = list.get(i);return file;}//递归进行查杀@Overridepublic void killVirus() {System.out.println("对文件夹"+name+"内进行查杀...");for (AbstractFile obj : list) {obj.killVirus();}}
}public class client {public static void main(String[] args) {//创建文件夹Folder folder1=new Folder("Java资料");Folder folder2=new Folder("图片资料");Folder folder3=new Folder("文本资料");//创建图像及文本文件ImageFile file1=new ImageFile("思维导图.jpg");ImageFile file2=new ImageFile("类图.png");TextFile file3=new TextFile("Java基础.doc");TextFile file4=new TextFile("Java进阶.txt");//将图像及文本添加进文件夹folder2.add(file1);folder2.add(file2);folder3.add(file3);folder3.add(file4);//将两个文件夹添加进父文件夹folder1.add(folder2);folder1.add(folder3);//递归进行查杀folder1.killVirus();}
}
  1. 测试运行

四、扩展

组合模式根据抽象构件类的定义形式又可以分为透明组合模式和安全组合模式。

如上,例三的应用案例就是透明组合模式。
透明组合模式结构图:

透明组合模式的缺点是不够安全,因为叶子对象和容器对象在本质是有区别的。叶子对象不可能有下一个层次的对象,即不可能包含成员对象,因此为其提供add,remove,getChild等方法是没有意义的,这在编译阶段不会出错,但在运行阶段如果调用这些方法可能会出错。(如果没有提供相应的错误处理代码)。

安全组合模式结构图:

抽象构件中没有声明任何用于管理成员对象的方法,对于叶子对象,客户端不可能调用到这些方法,所以这种做法是安全的。而安全组合模式的缺点就是不够透明,因为叶子构件和容器构件具有不同的方法,且容器构件中那些用于管理成员对象的方法没有在抽象构件类中定义,因此客户端不能完全针对抽象编程,必须有区别地对待叶子构件和容器构件。

五、总结

  1. 特点

组合模式用于组合多个对象形成树形结构以表示具有部分-整体关系地层次结构。包含抽象构件类,叶子构件类,容器构件类。

  1. 适用场景

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

Java设计模式之组合模式(透明组合模式,安全组合模式)相关推荐

  1. Java设计模式(方法工厂类、单例模式、代理模式、策略模式、适配器、观察者、装饰类等)

    目录 一.简单工厂模式(Factory Method) 二.工厂方法模式 三.抽象工厂模式(Abstract Factory) 3.1 三个工厂模式区别: 四.单例模式(Singleton) 1.饿汉 ...

  2. 初学 Java 设计模式(三):实战抽象工厂方法模式 「QQ 厘米秀装扮」

    一.抽象工厂方法模式介绍 1. 解决的问题 通过接口的选择,解决在系统产品存在多个产品族,而系统仅消费某一族的产品的问题. 2. 定义 抽象工厂模式是一个围绕超级工厂创建其他工厂的模式,即抽象工厂是一 ...

  3. Java设计模式,行为型(一)(策略模式,命令模式)

    策略模式(Strategy) 策略模式用来分离算法的实现,类比与if-else:通过上下文对实现进行管理. 约束接口: public interface IPay {void pay(Context ...

  4. Java设计模式之从[暗黑破坏神存档点]分析备忘录(Memento)模式

    在大部分游戏中,都有一个"存档点"的概念.比如,在挑战boss前,游戏会在某个地方存档,假设玩家挑战boss失败,则会从这个存档点開始又一次游戏.因此,我们能够将这个"存 ...

  5. java 设计模式之 观察者模式 发布订阅(Publisher/Subscribe)模式

    interface Subject {//通知人void setAction(String action);void attach(Observer observer);void detach(Obs ...

  6. Java设计模式之装饰模式(透明装饰模式,半透明装饰模式)

    一.概述 动态地给一个对象增加一些额外的职责(方法).就扩展功能而言,装饰者模式提供了一种比使用子类更加灵活的替代方案. 装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式给对象动态增加职 ...

  7. Java设计模式中组合模式是什么/树形结构怎么组合或显示存储,编程怎么实现树形结构

    继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用! 5.7 组合模式 5.7.1 概述 又名整体模式,是用于把一组相似的对象当作一个单一的对象 依据树形结构 ...

  8. 【每天一个java设计模式(二十三)】 - 访问者模式

    在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者 ...

  9. 【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)

    什么是设计模式:[每天一个java设计模式(零)] - 设计模式基本概念及七大设计原则 创建型模式 工厂模式:[每天一个java设计模式(一)] - 工厂模式 抽象工厂模式: [每天一个java设计模 ...

  10. Java::设计模式

    Java设计模式 一.概述 二.原则 三.模式 四.总结 一.概述 二.原则 设计模式遵循7 种设计原则,它们分别为开闭原则.里氏替换原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则和合成复 ...

最新文章

  1. Spark Steaming 点滴
  2. Windows Server 2003 AD升级到Windows Server 2008 AD的方法及详细步骤
  3. cannot be cast to org.springframework.web.accept.ContentNegotiationManager
  4. python画图程序-无所不能的python编程是怎么快速画图的呢?5分钟学会!
  5. C语言程序设计50例(三)(经典收藏)
  6. 关于 href=javascript:; 到底做了什么
  7. Comparable and Comparator API
  8. [c++基本语法]——构造函数初始化列表
  9. maya材质sheen_maya怎样做耐磨金属质感?
  10. CSS选择器速记笔记
  11. Gradle DSL method not found: ‘compile()’
  12. 不属于jsp构成元素_JSP构成元素-JSP基础
  13. 分享一个NHibernate的博客链接
  14. 串行通信协议 CAN 和 LIN
  15. 大数据面试题及答案-汇总版
  16. 图书管理系统项目开发计划书
  17. mac关闭虚拟内存_为什么不应该关闭Mac上的虚拟内存
  18. 对象模型学习总结 (一) . 关于封装
  19. matlab解决力学问题程序,力学专业程序实践:用MATLAB解决力学问题的方法与实例...
  20. 【3D建模制作技巧分享】Zbrush中凹凸贴图、法线贴图和置换贴图的区别

热门文章

  1. 能用C语言敲一段代码实现从1到100的排序吗?
  2. [bsoj2947] 失落天使
  3. python hexdump_笨办法学 Python · 续 练习 26:`hexdump`
  4. Crypto世界的显学:先驱熵学
  5. Matlab光标在线上移动,vi光标移动及常用指令
  6. 一文搞懂图的存储与遍历
  7. 快乐数之数学规律解题
  8. GD32实战7__中断
  9. 实用好玩的API文档
  10. 虚拟服务器集群新建linux虚拟机模板操作步骤