一、组合模式简介
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
组合模式让我们可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。
组合模式涉及角色:
1、Component:是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2、Leaf:在组合中表示叶子结点对象,叶子结点没有子结点。
3、Composite:定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
使用场景:
1、表示对象的部分-整体层次结构(树形结构)如树形菜单,文件、文件夹的管理。 
2、用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

二、示例演示
1、业务需求
这里用组合模式来完成一个树状结构的组成
--根节点
----子节点child
-------child之子节点一
-------child之子节点二
----子节点child2

2、编写Component抽象类

abstract class Component {  String name;public Component(String s){this.name=s;}public abstract void add(Component c);public abstract void remove(Component c);public abstract void foreach();
}

3、编写Composite枝节点

class Composite extends Component{
private List<Component>child=new ArrayList<Component>
();public Composite(String s) {super(s);// TODO Auto-generated constructor stub
}@Override
public void add(Component c) {child.add(c);}@Override
public void foreach() {// TODO Auto-generated method stubSystem.out.println("节点名:\t"+name);for (Component c : child) {c.foreach();}
}@Override
public void remove(Component c) {// TODO Auto-generated method stubchild.remove(c);
}}

4、编写Leaf类,注意leaf不包含子节点。

class Leaf extends Component{public Leaf(String s) {super(s);}@Override
public void add(Component c) {// TODO Auto-generated method stub}
@Override
public void foreach() {System.out.println("tself name-->"+this.name);
}@Override
public void remove(Component c) {// TODO Auto-generated method stub}

5、测试

public static void main(String[] args) {Component component=new Composite("根节点");Component child=new Composite("一级子节点child");Component child_1=new Leaf("一级子节点child之子节点一");Component child_2=new Leaf("一级子节点child之子节点二");child.add(child_1);child.add(child_2);Component child2=new Composite("一级子节点child2");component.add(child);component.add(child2);component.foreach();
}

结果如下:
节点名:一级子节点child
tself name-->一级子节点child的子节点一
tself name-->一级子节点child的子节点二
节点名:一级子节点child2

三、总结
当发现需求中是体现部分与整体层次结构时,以及希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式。

转载于:https://www.cnblogs.com/kangsir/p/6653221.html

java设计模式之组合模式相关推荐

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

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

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

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

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

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

  4. Java 设计模式之组合模式

    一.了解组合模式 1.1 什么是组合模式 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次机构.组合能够使客户以一致的方式处理个别对象以及组合对象. 组合模式让我们能够用 ...

  5. 【Java设计模式】组合模式

    转自:  https://blog.csdn.net/qq_42322103/article/details/95457321 漫谈网站优化提速: https://blog.csdn.net/mete ...

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

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

  7. java设计模式用组合模式实现树形结构

    现有如下需求,某公司的机构: +公司 +分公司 +本地分公司 -呼和浩特 +包头 -昆区办事处 -青山办事处 +外地分公司 +总部 -人事处 +办公室 +财务处 实现思路: 抽象组合类,叶子类,根类 ...

  8. (设计模式十一)java设计模式之组合模式

    定义: 组合模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构.这种模式创建了一个包含 ...

  9. java设计模式之组合模式(Composite)

    在现实生活中,存在很多"部分-整体"的关系,例如,大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等.在软件开发中也是 ...

  10. Java设计模式之组合模式(透明组合模式,安全组合模式)

    一.概述 组合多个对象形成树形结构以表示具有部分-整体关系的层次结构,可以让客户端统一对待单个对象和组合对象. 组合模式关注那些包含叶子构件和容器构件的结构以及它们的组织形式,在叶子构件中不包含成员变 ...

最新文章

  1. 写文件 —— 将内容按照指定格式写入配置文件(fprintf()函数-》》本机的监听地址列表中port值)
  2. ruby 正则表达式 使用正负预查
  3. leetcode_zigzag conversion
  4. Fragment创建添加切换和对应底部导航(二)
  5. Java中的ThreadPoolExecutor类
  6. influxdb连续查询CQ和保留策略RP
  7. c# 空接合(??)运算符的运用
  8. String、StringBuffer、StringBuilder之间的区别 简明介绍
  9. COMPUTEX展 CPX论坛聚焦AI与物联网
  10. tomcat 发布到服务器启动不了
  11. 梅花雨无法在 .net 2.0 下用行的问题
  12. -1交替c语言代码,排序(1)---------选择排序(C语言实现)(示例代码)
  13. Linux的Netfilter框架深度思考-对比Cisco的ACL
  14. Silverlight for Windows Phone 7开发系列(1):环境搭建
  15. 华为荣耀10电路原理图
  16. USYD悉尼大学DATA1002 OralExam 复习(可能会考的内容)
  17. React 问题总结
  18. LeetCode 1052 爱生气的书店老板 HERODING的LeetCode之路
  19. 紫外线检测仪,WKM-UV1,紫外线检测仪UV汞灯LEDUV通用
  20. 找到任务栏广告弹窗的源头

热门文章

  1. iSCSI网络储存应用
  2. Audio -- Music Playback 框图
  3. 编译nanopi neo 或者M1 uboot 启动SylixOS系统
  4. android studio 中禁用一个插件功能
  5. Voltage Keepsake CodeForces - 801C(二分)
  6. ca 手机抓包_手机 https 抓包---Charles篇
  7. 用python建云盘_超简单!基于Python搭建个人“云盘”
  8. ImportError: cannot import name ‘abs‘
  9. 【解题报告】图论基础练习(一)
  10. 古希腊之争(一)详解(C++)