一.定义

组合模式也叫整体-部分模式,目的是为了实现整体和部分都有一组相同的操作方法。

属于结构型模式

注意区别一下组合和聚合的区别:

组合:各部分组织结构有相同的生命周期,例如人的各个器官和人,人死了器官也就消亡了;文件夹删了里面的文件也没了

聚合:各部分组织结构不具有相同生命周期,一个离开了另一个还能存活,例如桌子和电脑

二.实现

1.组件

抽象组件:一般是一个接口或者抽象类,定义通用的行为

具体组件:实现抽象组件的方法,定制自己的行为

2.通用写法

举一个文件目录的例子吧

定义一个抽象组件Directory,他具有rename,getName通用方法,子类可以实现也可以不实现,还有show抽象方法,由具体的子类去实现。

public abstract class Directory {protected String name;public Directory(String name) {this.name = name;}public String getName() {return name;}public void rename(Directory directory, String newName) {System.out.println(directory.getName() + "重命名为 --> " + newName);}abstract void show();
}

定义一个具体组件,目录类Folder,它实现了父类Directory的show方法,并且自定义了一些自己的方法addChild和removeChild

public class Folder extends Directory{/*** 层级*/private Integer level;private List<Directory> directoryList = new LinkedList<Directory>();public Folder(String name, Integer level) {super(name);this.level = level;}/*** 新增子节点* @param directory*/public void addChild(Directory directory) {this.directoryList.add(directory);}/*** 删除子节点* @param directory*/public void removeChild(Directory directory) {this.directoryList.remove(directory);}/*** 打印信息*/@Overridepublic void show() {System.out.println(this.name);for (Directory directory : directoryList) {if (this.level != null) {for (Integer i = 0; i < this.level; i++) {System.out.print("   ");}for (Integer i = 0; i < this.level; i++) {if (i == 0) {System.out.print("+");}System.out.print("-");}}directory.show();}}
}

创建一个具体的组件File类,继承Directory,实现了show方法

public class File extends Directory {public File(String name) {super(name);}@Overridepublic void show() {System.out.println(this.name);}
}

客户端测试类:

public class Test {public static void main(String[] args) {Folder folder1 = new Folder("office", 2);File ppt = new File("ppt");File excel = new File("excel");File word = new File("word");folder1.addChild(ppt);folder1.addChild(excel);folder1.addChild(word);Folder folder2 = new Folder("entertainment", 2);File qq = new File("qq");File wx = new File("wechat");folder2.addChild(qq);folder2.addChild(wx);Folder root = new Folder("d:", 1);root.addChild(folder1);root.addChild(folder2);root.show();}
}

输出

上面的例子中,File和Folder都有一个共同的方法rename,同时也对show方法进行了不同的实现,Folder还定义了自己的addChild和removeChild方法,这种抽象组件不声明全部的方法子类在需要时进行定制的方法属于安全模式的组合模式。除了安全模式的组合模式外,还有透明模式的组合模式,就是抽象组件定义全部的方法,子类可以覆盖或者不覆盖,这种方式违背了迪米特法则。

那么什么时候用安全模式的什么时候用透明模式呢?

安全模式:子类要实现的方法大部分都不相同时

透明模式:子类要实现的方法大部分都相同时

三.组合模式在源码中的应用

HashMap、ArrayList、SqlNode

四.组合模式的优缺点

优点:符合开闭原则,忽略了层次的差异,方便对整个层次结构进行控制

缺点:抽象行为设计比较复杂

(九)Java架构师成长之路-设计模式:组合模式相关推荐

  1. Java架构师成长之路

    目录导航 前言 一.源码分析专题 1.1 设计模式详解 1.2 Mybatis源码分析 1.3 Spring5源码分析 二.分布式架构专题 2.1 漫谈分布式架构 2.2 分布式架构的基础 2.3 分 ...

  2. JAVA开发(JAVA架构师成长之路)

    从一个最基础的JAVA开发人员成为JAVA架构师,需要经历8层能力的进阶. 第一阶段:熟悉JAVA基础语法,学会写各种if else和流程语句,熟练使用各种数据类型,集合.能依葫芦画瓢,模仿别人的代码 ...

  3. Java架构师成长之路-100问

    1.        进程与线程区别 2.        进程间通信方式 3.        网络七层 4.        TCP与UDP区别 5.        ajax状态.实现原理 6.      ...

  4. java架构师成长之路_java架构师成长之路

    一:并发编程 + activemq + 实战案例并发编程基础篇 第一天 1.课程大纲简要介绍 2.线程基础概念.线程安全概念.多个线程多个锁概念 3.对象锁的同步和异步 4.脏读概念.脏读业务场景.S ...

  5. WEB架构师成长之路-摘录

    一 .学习面向对象的基础知识,那你的编程之路注定是在做原始初级的重复! 很多程序员都知道类.方法.抽象类.接口等概念,但是为什么要面向对象,好处在哪里,要解决什么问题 降低软件开发的复杂度 提高软件开 ...

  6. 架构师成长之路:如何提升技术掌控力?

    架构师成长之路:如何提升技术掌控力? 简介: 在很多人眼里,架构师就犹如古代的将军一般,既能运筹帷幄决胜千里,又能独闯敌营取人首级,是所有士兵们崇拜的偶像...好了,其实我只是想说:能成为一名优秀的架 ...

  7. 如何成为一名架构师,架构师成长之路(转)

    转自http://blog.csdn.net/fei33423/article/details/61934514 如何成为一名架构师,架构师成长之路 原创 2017年03月13日 22:50:34 3 ...

  8. Web架构师成长之路

    Web架构师成长之路 本人也是coding很多年,虽然很失败,但也总算有点失败的心得,不过我在中国,大多数程序员都是像我一样,在一直走着弯路.如果想成为一个架构师,就必须走正确的路,否则离目标越来越远 ...

  9. Java架构师成长之道之Java架构师技术栈

    Java架构师成长之道之Java架构师技术栈 Java架构师成长之道 JavaSE篇 Java概述与开发环境搭建 Java数据存储 Java数据运算 Java程序流程控制 Java数组 Java面向对 ...

最新文章

  1. 张仰彪第二排序法_C语言中的最常用的两种排序算法你知道吗?
  2. centos5.6无法ping,无法scp的问题解析
  3. Loadrunner12解决无法录制chrome及脚本为空问题
  4. nginx做正向代理
  5. python列表迭代器_关于Python中迭代器的作用
  6. UNIX再学习 -- 网络与网络协议
  7. C语言学习之用指针方法对10个整数按由大到小顺序排序
  8. js 正则 长度不超过50_如何花不超过50元人民币,拍抖音网红海马体照片?
  9. JavaScript中带有示例的Math.max()方法
  10. 2017.8.10 树上染色 失败总结
  11. SQL Server中并行执行计划的基础
  12. tomcat升级步骤
  13. 创新产品访谈:Ntalker V2.5
  14. kubernetes配置kubeconfig访问集群
  15. html盒模型中border的写法,CSS盒模型--边框设置:border: 1px solid red(像素 样式 颜色 ),border-bottom:1px dotted #ccc...
  16. unlikely 与 likely的作用
  17. 儿童编程Scratch入门课程都学习什么内容?
  18. android 仿qq相册功能,Android第四十九期 - 仿QQ空间上传功能+本地数据库存储
  19. mysql启动报错,ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid
  20. PyQy5学习(二):QMainWindow+QWidget+QLabel

热门文章

  1. poli-java开源BI软件
  2. 如何巧用设计模式,干掉if-else
  3. 转载:获取屏幕的分辨率(多屏幕或者单屏幕)
  4. 中鼎网2008奥运板块SEO分析
  5. 面向对象编程的23种设计模式
  6. dos系统下Python换行方法
  7. 功能强大的远程终端神器MobaXterm
  8. SSL证书失效导致无法上传问题
  9. 哪种耳机适合跑步、适合跑步的耳机推荐
  10. 什么是HINSTANCE