本文源码:GitHub·点这里 || GitEE·点这里

一、生活场景

1、文件系统

下图是常见的计算机文件系统的一部分。

文件系统是一个树结构,树上长有节点。树的节点有两种:

  • 树枝节点

即文件夹,有内部树结构,在图中涂有颜色;

  • 树叶节点

另一种是文件,即树叶节点,没有内部树结构。

2、打印文件树结构

public class C01_InScene {public static void main(String[] args) {File file = new File("F:\\tree") ;fileTree(file, 0);}private static void fileTree(File file, int floor) {// 判断是否存在if (file.exists()) {if (floor > 0) {// 循环打空格for (int i = 0; i < floor; i++) {System.out.print(" ");}}if (file.isDirectory()) {System.out.println("+" + file.getName());// 列出所有文件及文件夹File[] files = file.listFiles();if (null != files) {// 循环递归for (File dirFile : files) {fileTree(dirFile, floor + 1);}}} else {System.out.println("-" + file.getName());}}}
}

执行效果:+代表文件夹,-代表文件。

+tree+dir1+dir2-dir2Leaf.txt-leaf1.txt-leaf2.txt-OneLeaf.txt-TwoLeaf.txt

3、组合模式描述

组合模式属于对象的结构模式,有时又叫做“部分——整体”模式。组合模式将对象组织到树结构中,可以用来描述整体与部分的关系。组合模式可以使客户端将单纯元素与复合元素同等看待。

二、组合模式-安全式

1、基础概念

安全式的组合模式要求管理聚集的方法只出现在树枝构件类中,而不出现在树叶构件类中。涉及到三个角色:

  • 抽象构件(Component)角色

它给组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。组合对象通常把它所包含的子对象当做类型为Component的对象。在安全式的组合模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝构件对象给出。

  • 树叶构件(Leaf)角色

树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。

  • 树枝构件(Composite)角色

代表参加组合的有下级子对象的对象。树枝构件类给出所有的管理子对象的方法,如add()、remove()以及getChild()。

2、模式图解

3、源代码实现

public class C02_Security_Model {public static void main(String[] args) {Composite root = new Composite("服装");Composite composite1 = new Composite("男装");Leaf manCoat = new Leaf("上衣");Leaf manBottom = new Leaf("下衣");composite1.addChild(manCoat);composite1.addChild(manBottom);Composite composite2 = new Composite("女装");Leaf leaf1 = new Leaf("鞋子");Leaf leaf2 = new Leaf("帽子");root.addChild(leaf1);root.addChild(leaf2);root.addChild(composite1);root.addChild(composite2);root.printStruct("");}
}
// 抽象构件角色类
interface Component {/** 输出组件自身的名称*/void printStruct(String preStr);
}
// 树枝构件角色类
class Composite implements Component{// 用来存储组合对象中包含的子组件对象private List<Component> childComponents = new ArrayList<Component>();// 输出对象的名称private String name;// 构造方法,传入组合对象的名字public Composite (String name){this.name = name;}/*** 聚集管理方法,增加一个子构件对象* @param child 子构件对象*/public void addChild(Component child){childComponents.add(child);}/*** 聚集管理方法,删除一个子构件对象* @param index 子构件对象的下标*/public void removeChild(int index){childComponents.remove(index);}/*** 聚集管理方法,返回所有子构件对象*/public List getChild(){return childComponents ;}/*** 输出对象的自身结构* @param preStr 前缀,主要是按照层级拼接空格,实现向后缩进*/@Overridepublic void printStruct(String preStr) {//先输出自己System.out.println(preStr+"+"+this.name);//如果还包含有子组件,那么就输出这些子组件对象if (this.childComponents != null){//添加两个空格,表示向后缩进两个空格preStr = preStr+"  ";//输出当前的子对象:使用函数递归的原理for (Component c : childComponents) {c.printStruct(preStr);}}}
}
class Leaf implements Component{// 输出叶子对象的名称private String name;// 构造方法,传入叶子对象的名称public Leaf (String name){this.name = name ;}/*** 输出叶子对象的结构,叶子对象没有子对象,也就是输出叶子对象的名字* @param preStr 前缀,主要是按照层级拼接的空格,实现向后缩进*/@Overridepublic void printStruct(String preStr) {System.out.println(preStr+"-"+name);}
}
  • 输出结果
+服装-鞋子-帽子+男装-上衣-下衣+女装

三、组合模式-透明式

1、概念图解

与安全式的组合模式不同的是,透明式的组合模式要求所有的具体构件类,不论树枝构件还是树叶构件,均符合一个固定接口。

2、源代码实现

public class C03_Transparent_Model {public static void main(String[] args) {Component1 root = new Composite1("服装");Component1 c1 = new Composite1("男装");Component1 c2 = new Composite1("女装");Component1 leaf1 = new Leaf1("衬衫");Component1 leaf2 = new Leaf1("夹克");Component1 leaf3 = new Leaf1("裙子");Component1 leaf4 = new Leaf1("套装");root.addChild(c1);root.addChild(c2);c1.addChild(leaf1);c1.addChild(leaf2);c2.addChild(leaf3);c2.addChild(leaf4);root.printStruct("");}
}
abstract class Component1 {/*** 输出组件自身的名称*/public abstract void printStruct(String preStr);// 聚集管理方法,增加一个子构件对象public void addChild(Component1 child){/*** 缺省实现,抛出异常,因为叶子对象没有此功能* 或者子组件没有实现这个功能*/throw new UnsupportedOperationException("对象不支持此功能");}// 聚集管理方法,删除一个子构件对象public void removeChild(int index){/*** 缺省实现,抛出异常,因为叶子对象没有此功能* 或者子组件没有实现这个功能*/throw new UnsupportedOperationException("对象不支持此功能");}// 聚集管理方法,返回所有子构件对象public List<Component1> getChild(){/*** 缺省实现,抛出异常,因为叶子对象没有此功能* 或者子组件没有实现这个功能*/throw new UnsupportedOperationException("对象不支持此功能");}
}
class Composite1 extends Component1 {// 用来存储组合对象中包含的子组件对象private List<Component1> childComponents = new ArrayList<Component1>();// 输出对象名称private String name ;public Composite1 (String name){this.name = name;}/*** 聚集管理方法,增加一个子构件对象* @param child 子构件对象*/public void addChild(Component1 child){childComponents.add(child);}/*** 聚集管理方法,删除一个子构件对象* @param index 子构件对象的下标*/public void removeChild(int index){childComponents.remove(index);}// 聚集管理方法,返回所有子构件对象public List<Component1> getChild(){return childComponents ;}/*** 输出对象的自身结构* @param preStr 前缀,主要是按照层级拼接空格,实现向后缩进*/@Overridepublic void printStruct(String preStr) {// 首先输出自己名称System.out.println(preStr+"+"+this.name);// 如果还包含有子组件,那么就输出这些子组件对象preStr = preStr + "  ";if (this.childComponents != null) {// 添加两个空格,表示向后缩进for (Component1 c : childComponents) {递归输出每个子对象c.printStruct(preStr);}}}
}
class Leaf1 extends Component1 {private String name;public Leaf1 (String name){this.name = name;}/*** 输出叶子对象的结构,叶子对象没有子对象,也就是输出叶子对象的名字* @param preStr 前缀,主要是按照层级拼接的空格,实现向后缩进*/@Overridepublic void printStruct(String preStr) {System.out.println(preStr+"-"+name);}
}

四、JDK中应用

1、HashMap结构图

2、分层结构

  • interface Map
  • class AbstractMap implements Map
  • HashMap extends AbstractMap implements Map
  • interface Map.Entry
  • Node implements Map.Entry

3、源代码

  • 存储叶子节点
public V put(K var1, V var2) {return this.putVal(hash(var1), var1, var2, false, true);
}
final V putVal(int var1, K var2, V var3, boolean var4, boolean var5) {HashMap.Node[] var6 = this.table;.......
}
  • 存储树枝节点
public void putAll(Map<? extends K, ? extends V> var1) {this.putMapEntries(var1, true);
}

五、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(10):组合模式相关推荐

  1. 组合模式_[设计模式]10.组合模式

    组合模式,也叫"部分整体模式",它把相似的对象组合成树形结构的一个整体.于是,只需一个代表,我们就能继续访问与之相关的同族对象. 模式卡片 模式UML图 七个例子 部门里人很多,大 ...

  2. java设计模式之组合模式(树形层级)

    java设计模式之组合模式 学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来 ...

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

    文章目录 详解Java设计模式之组合模式 案例引入 组合模式 定义 模式类图结构 相关角色 典型代码 案例分析 类图设计 实例代码 结果分析 JavaJDK中的组合模式 透明组合模式 安全组合模式 组 ...

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

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

  5. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  6. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  7. 1、【设计模式】组合模式

    java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...

  8. 结构型设计模式之组合模式

    结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...

  9. 每天一个设计模式之组合模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

最新文章

  1. 用自定义方法,传入成绩数组,实现输出考试成绩的成三名
  2. 解读ASP.NET 5 MVC6系列(6):Middleware详解
  3. C#中判断某软件是否已安装
  4. building commercial website using Microsoft tech stack
  5. 编写下载服务器。 第六部分:描述您发送的内容(内容类型等)
  6. IDEA 点击进入方法内部_一份最详细的 IDEA调试教程,让bug无处藏身!
  7. python 键盘输入一个整数、输出它的千位与百位_Python编程习题
  8. java是否存在引用传递_Java永远不会传递引用,对吧?
  9. python 日历控件_PyQt5每天必学之日历控件QCalendarWidget
  10. 工资管理系统源码下载
  11. Effective C++ item 6
  12. python100天从新手到大师下载_GitHub - chenqiyi/Python-100-Days: Python - 100天从新手到大师...
  13. 可视化设计,类Excel的快速开发平台
  14. 请帮忙扩写韩翃“寒食”这首诗
  15. 面向对象与面向过程编程
  16. 搭建授权服务器oauth2
  17. iOS最全的三方库、插件、博客汇总
  18. Flutter开始支持Windows了
  19. NetworkManager的命令行工具nmcli
  20. Pintos project 1 实验报告(代码分享)

热门文章

  1. 数据结构之图的存储结构:邻接表法
  2. 总线的通信方式特点及同步通信的过程
  3. history 历史命令记录功能如何防坏人(高级)
  4. 设计模式:外观模式(C++)【颜值很重要】
  5. gcc在64位系统上一个史诗级WARNING
  6. 编程题练习 两个栈实现队列
  7. LibreOffice去重复数据
  8. HDOJ(HDU) 1994 利息计算(简单题目)
  9. 字符串数组转换为整型数组
  10. Mysql对用户操作加审计功能——高级版