定义:

组合多个对象形成树形结构来表示“整体-部分”关系的层次结构,其中的叶子对象和容器对象具有相同的接口,可以使用抽象类来进行管理。

结构图:

  • Component:抽象构件类,对叶子构件和容器构件声明抽象接口,包含它们所共有的行为和方法。同时也可以定义访问及管理它子构件的方法。
  • Left:叶子构件,表示树形结构中的叶子节点,仅仅实现抽象构件类中定义的行为方法。因为没有子构件,对管理子构件的方法可以抛出异常处理。
  • Composite:容器构件,包含子节点,其子节点可以是叶子节点,也可以是容器节点。对于行为方法,可以递归调用子节点的行为方法来完成业务;对应实现抽象构件中定义的管理子构件的方法。

两种模式:

对于抽象构件中既有构件行为方法和管理构件的方法,可以有两种解决方法。

透明模式:

  • 将抽象构建类定义为抽象类,并为管理方法提供默认实现。
//提供默认实现的抽象构件类
abstract class AbstractFile {
public void add(AbstractFile file) {
System.out.println("对不起,不支持该方法!");
} public void remove(AbstractFile file) {
System.out.println("对不起,不支持该方法!");
} public AbstractFile getChild(int i) {
System.out.println("对不起,不支持该方法!");
return null;
} public abstract void killVirus();
}
  • 叶子构件继承该类时,不需要再重新实现管理方法;而容器构件则需要重新实现这些管理方法,并做覆盖。
  • 客户端使用时,不能针对抽象接口编程;对于叶子节点,必需要使用具体叶子构件类型来定义叶子对象。

安全模式:

  • 在抽象构件中仅定义行为方法,而不定义管理方法。客户端不会遇到叶子节点因为不存在方法而存在的异常。
  • 但不能透明地使用容器构件,对容器构件需要特殊生命其类别。

优点:

  • 可以表示比较复杂的树形关系,如果要新增叶子类和容器类都可以方便扩展。
  • 统一了叶子构件和容器构件的接口,在执行业务方法时可以使用递归策略。

缺点:

  • 难以避免在透明模式和安全模式中选择,但两种模式都有自己的缺点,使得客户端使用不透明。
  • 不能限制容器下的叶子类型,所有的容器和叶子都依赖于一个接口。

适用情况:

  • 需要构件一个树形结构的模式,可以区分整体和部分的差异,客户端可以一致地对待它们。

实例:

CompositePattern.java

七个结构模式之组合模式(Composite Pattern)的更多相关文章

  1. 设计模式GOF23(结构型模式:代理模式,适配模式,桥接模式,组合模式,装饰模式,外观模式,享元模式)

    结构型模式: – 分类: • 适配器模式.代理模式.桥接模式.装饰模式.组合模式.外观模式.享元模式 – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题.   结构 ...

  2. Java计模模式之六 ----- 组合模式和过滤器模式

    前言 在上一篇中我们学习了结构型模式的外观模式和装饰器模式.本篇则来学习下组合模式和过滤器模式. 组合模式 简介 组合模式是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来 ...

  3. 迭代器模式和组合模式(head first设计模式——8)

    把迭代器模式和组合模式放在同一篇的原因是其联系比较紧密. 一.迭代器模式 1.1迭代器模式定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示. 这个模式提供了一种方法 ...

  4. 使用C# (.NET Core) 实现组合设计模式 (Composite Pattern)

    本文的概念性内容来自深入浅出设计模式一书. 本文需结合上一篇文章(使用C# (.NET Core) 实现迭代器设计模式)一起看. 上一篇文章我们研究了多个菜单一起使用的问题. 需求变更 就当我们感觉我 ...

  5. 设计模式---数据结构模式之组合模式(Composite)

    前提:数据结构模式 常常有一些组建在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大的破坏组件的复用.这时候,将这些数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无 ...

  6. 结构型模式(四) 组合模式(Composite)

    一.动机(Motivate) 在我们的操作系统中有文件夹的概念,文件夹可以包含文件夹,可以嵌套多层,最里面包含的是文件,这个概念和"俄罗斯套娃"很像.当然还有很多的例子,例如我们使 ...

  7. 设计模式16---设计模式之组合模式(Composite)(行为型)

    1.场景模拟 使用软件模拟大树的根节点和树枝节点和叶子节点 抽象为两类,容器节点和叶子节点 2.不用模式的解决方案 package demo14.composite.example1; import ...

  8. Java设计模式(8)——结构型模式之组合模式(Composite)

    一.概述 定义 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. 简图 角色——对应上图中顶点为Component,左边为Leaf,右边为C ...

  9. [19/04/26-星期五] GOF23_结构型模式(桥接模式、组合模式)

    一.桥接模式(bridge) 场景:商城系统中常见的商品分类,以电脑为例,首先想到使用多层继承结构. —— 台式机(联想台式机.戴尔台式机.神舟台式机) 电脑    ——笔记本(联想笔记本.戴尔笔记本 ...

  10. GoF23种设计模式之结构型模式之组合模式

    一.概述 将对象组合成树型结构以表示“部分--整体”的层次关系.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 1.你想表示对象的部分--整体层次结构的时候. 2.你希望用户忽略组 ...

随机推荐

  1. Spring Cloud 配置服务

    Spring Cloud 配置服务 1. 配置服务简介 产生背景: 传统开发中,我们通常是将系统的业务无关配置(数据库,缓存服务器)在properties中配置,在这个文件中不会经常改变,但随着系统规 ...

  2. jQuery UI AutoComplete的使用

    现场提出优化单,Table Mapping里关于获取数据源下所有表名的地方由于表数量过多选择不便,需添加搜索功能.原本的实现是一个Dialog ,现打算将其改为AutoComplete. 框架使用的是 ...

  3. 通过telnet来实践HTTP协议。

    这是一篇实践教程,能够让你更加深刻的理解HTTP协议,因此需要一定的HTTP基础. 协议:一种规定,规定了你应该怎么去做,如w3c规定了浏览器应该怎么去解析HTML,CSS,JS.而HTTP则规定了客 ...

  4. javaBean和jsp应用

    原网页:http://www.douban.com/note/102320977/ JavaBean是一种可复用,跨平台的组件.共有两种JavaBean:一种无用户界面,这种一般用于处理数据运算,操作 ...

  5. 面试题目: PHP 有哪些优缺点?

    当面试官噼里啪啦的问你一大堆问题后,突然问你,PHP有哪些优缺点?你蒙了没? 反正我是蒙了,不管你信不信! 现在,关于PHP优缺点,大致的说几点: 1.  语法简单的,上手很快,而且还有很多很便捷的开 ...

  6. 记一次上传文件到七牛云存储的经历(Plupload & UEditor)(.net)

    七牛 配置ACCESS_KEY和SECRET_KEY Qiniu.Conf.Config.ACCESS_KEY = "ACCESS_KEY"; Qiniu.Conf.Config. ...

  7. zmNgFrameWork 架构升级ng1.5和md5静态资源缓存方案【angular1.x】

    前言: 在我前面的博客,angular项目总结——angular + browserify + gulp + bower + less 架构分享  把我开发angular的架构进行了分享,并上传到了g ...

  8. CSS 魔法系列:纯 CSS 绘制基本图形(圆、椭圆等)

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  9. 【Android】使用属性动画碰到的困惑及讲解

    属性动画的教程网上已经特别多了,本篇也不打算再去各种详解知识点,主要就是记录题主学习属性动画时的碰到的一些困惑,以及后来自己的理解.如果有人也碰到相似的问题,正好可以一起讨论下. 概要 本篇主要涉及的 ...

  10. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(4)

    这个系列已经写了6篇,链接地址如下: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Auto ...