初始印象

  在开发中存在很多整体和部分的关系,这个方式最大的体现就是树形结构。组合模式就是为了更好地解决这类业务场景的问题。先看下组合模式的定义:

  将对象组合成树形结构以表示“整体—部分”的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。从定义中可以看出来组合二模式主要有两点;

    1、整体 - 部分 之间业务结构用树形表示。

    2、让组合对象和各个对象的使用具有一致性。

  

整体和部分的结构在生活中太广泛了,比如国家行政级别  中国 ,***省,**市 。学校管级别、公司管理组织机构等,下面以公司组织机构为例,来看看组合模式。

    

  根据这个公司组织结构的图片,来引进助兴结构的专业名词:总经理称之为 root 根节点,财务经理、技术经理、开发组长称之为 树枝节点(branch),财务专员、秘书称之为 叶子节点(leaf)。

而具体到代码的实现层面就是,组合模式的核心关键就是把这三个对象实现相同的接口,不管是在组件过程,还是后面的遍历,所有的节点都用相同的接口,使得对树形结构的操作更加方便。

  接着介绍组合模式的组成元素

  • Component:组合部件,为的是给 root、branch、leaf 不同的节点提供统一的接口。
  • Composite:复合节点,就是实现 root、branch 的节点,也叫容器节点。
  • Leaf : 叶子节点,不能再有下属节点。也叫简单节点。

应用例子

接下来吧上图中例子实现以下,能够更直观了解组合模式

// 相当于是 Component
public abstract class Zhiwei {
protected String name;
protected String position;
protected float salary; public Zhiwei(String name,String position,float salary){
this.name = name;
this.position = position;
this.salary = salary;
} public abstract void addChild(Zhiwei zhiwei); public abstract void removeChild(Zhiwei zhiwei); public abstract void display(String empty); } //相当于是 Composite
public class LingDao extends Zhiwei { private ArrayList<Zhiwei> children = new ArrayList<Zhiwei>(); public LingDao(String name,String position,float salary){
super(name,position,salary);
} @Override
public void addChild(Zhiwei zhiwei) {
// TODO Auto-generated method stub
children.add(zhiwei);
} @Override
public void removeChild(Zhiwei zhiwei) {
// TODO Auto-generated method stub children.remove(zhiwei);
} @Override
public void display(String empty) {
// TODO Auto-generated method stub
System.out.println(empty+"职位:"+this.position+" 姓名:"+this.name+" 薪水:"+this.salary);
for (Zhiwei zhiwei : children) {
zhiwei.display(empty+" ");
} } } //普通职员
public class Leaf extends Zhiwei { public Leaf(String name, String position, float salary) {
super(name, position, salary); // TODO Auto-generated constructor stub
} @Override
public void addChild(Zhiwei zhiwei) {
// TODO Auto-generated method stub
System.out.println("cannot add zhiwei to leaf");
} @Override
public void removeChild(Zhiwei zhiwei) {
// TODO Auto-generated method stub } @Override
public void display(String empty) {
// TODO Auto-generated method stub
System.out.println(empty+"职位:"+this.position+" 姓名:"+this.name+" 薪水:"+this.salary);
}
} //客户端
public class Client {
public static void main(String[] args) {
Zhiwei leader = new LingDao("张无忌","总经理",100000); Zhiwei manager = new LingDao("杨逍", "技术经理", 50000);
Zhiwei managerB = new LingDao("范瑶","财务经理",50000);
Zhiwei managerC = new LingDao("吴劲草","技术组长",20000); Zhiwei Employee = new LingDao("小昭","秘书",8000); Zhiwei EmployeeA = new LingDao("天字门","财务A",5000);
Zhiwei EmployeeX = new LingDao("地字门","财务B",5200);
Zhiwei EmployeeC = new LingDao("风字门","开发A",8800);
Zhiwei EmployeeD = new LingDao("雷字门","开发B",8400); leader.addChild(manager);
leader.addChild(managerB);
leader.addChild(Employee); manager.addChild(managerC);
manager.addChild(EmployeeC); managerC.addChild(EmployeeD); leader.display("");
}
} /********************控制台************************/ - 职位:总经理 姓名:张无忌 薪水:100000.0
- 职位:技术经理 姓名:杨逍 薪水:50000.0
- 职位:技术组长 姓名:吴劲草 薪水:20000.0
- 职位:开发B 职位:雷字门 薪水:8400.0
- 职位:开发A 姓名:风字门 薪水:8800.0
- 职位:财务经理 姓名:范瑶 薪水:50000.0
- 职位:财务A 姓名:风字门 薪水:5000.0
- 职位:财务B 姓名:地字门 薪水:5200.0
- 职位:秘书 姓名:小昭 薪水:8000.0

  通过这个例子可以看出来,不同级别的节点通过同一接口在客户端试用是非常方便的,调用的时候不用管他代表的是什么节点。因为能够同一试用。只是在 leaf 级别的节点中,考虑 addChild 、removeChild 给出错误提示即可。

对模式的分析

  我们进一步来分析组合模式的应用场景,除了在很明显的树形结构业务中用,在发挥我们的发散能力,应该能够想到,只要拥有父子关系的场景中都是可以用的比如窗体打开的父子窗口、各种单位的人事制度的组织结构、文件管理系统、软件系统的树形结构导航。

  在思考了组合模式的应用场景后,在考虑下组合模式的优势:

1、定义了实现不同层次的对象的统一接口,对象行为更具有一致性。使得客户端调用比较简单。

  2、实现了整个业务场景的类层级的所属关系,通过类里面的 list 来实现。

  3、类实现更具一般性,使得代码更具有可扩展性。主要表现在新定义的 composite 和 leaf 继承了统一的操作接口,客户端就不用改变。

小结

  组合模式应用场景是具有父子结构的场景,典型的就是树形结构。模式的本质就是对不同级别的节点对象引入统一的接口,对不同级别对象调用、操作具有了一致性。

设计模式之(八)组合模式(COMPOSITE)的更多相关文章

  1. 设计模式系列之组合模式(Composite Pattern)——树形结构的处理

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  2. 设计模式学习心得<组合模式 Composite>

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  3. 《JAVA设计模式》之组合模式(Composite)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...

  4. 设计模式之:组合模式(Composite)

    支持原创:http://blog.csdn.net/hguisu/article/details/7530783 设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构 ...

  5. 设计模式(七)组合模式Composite(结构型)

    设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...

  6. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

  7. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  8. python 设计模式之组合模式Composite Pattern

    #引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...

  9. 浅谈设计模式--组合模式(Composite Pattern)

    组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...

  10. 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...

随机推荐

  1. 2.4 Scala函数式编程

    一.函数定义与使用 1.函数的定义 2.匿名函数 举例: Scala自动推断变量类型,不用声明: 一个下划线只能表示这一个参数的一次出现 二.高阶函数 定义:函数定义的括号里仍然是个函数的函数,叫作高 ...

  2. python的requests库

    requests是在爬虫中常用到的一个库,它可以帮助我们很好的去请求我们想要爬取的网站,并返回网站的内容. 0x01:请求 get请求.post请求这两个是最常用的请求方式,此外还有类似delete. ...

  3. 生鲜超市项目错误及解决办法(crispy_forms、外键指向自己、class嵌套访问父类、meta类及各种字段参数)

    为什么要在INSTALLED_APPS中加入crispy_forms? 因为django-crispy-forms 是对django form在html页面呈现方式进行管理的一个第三方插件. 为什么有 ...

  4. 测试脚本中的等待方法 alter对话框处理

    测试脚本中的等待方法 等待是为了使脚本执行更加稳定 1. 常用的休眠方式:time模块的sleep方法 2. selenium模块中的等待方法 等待查找5s 查找不到就报错 对登录测试py进行修改 a ...

  5. 安卓Jsoup爬虫

    第一步:导入Jsoup包:把你的jar包放在libs下面之后 接着就会显示在你的这个地方: 重要的还是源码(搞了很久 出错很多 终于成功):我做的是输入要查找的关键字百度百科爬取主要定义,按照标签爬取 ...

  6. 使用hangfire在xunit中

    框架为:abp hangfire配置连接:https://aspnetboilerplate.com/Pages/Documents/Hangfire-Integration 在单元测试中如何配置呢? ...

  7. Excel 文本函数

    1.FIND函数--要查找的字符在 字符串中 的  位置 FIND(find_text,within_text,start_num) Find_text 是要查找的字符串. Within_text 是 ...

  8. O(n log n)求最长上升子序列与最长不下降子序列

    考虑dp(i)表示新上升子序列第i位数值的最小值.由于dp数组是单调的,所以对于每一个数,我们可以二分出它在dp数组中的位置,然后更新就可以了,最终的答案就是dp数组中第一个出现正无穷的位置. 代码非 ...

  9. wal2json Dockerfile

    以下是一个wal2json pg扩展的dockerfile,方便测试使用 dockerfile FROM postgres:11.2 AS build ENV VERSION 1_0 RUN buil ...

  10. nowcoder911L 最优子区间

    题目链接 思路 用\(f(i,j)\)表示前i个元素,以i为右端点,j为左端点时的答案. 用个"区间修改,单点查询"的线段树维护出第二维.在从左往右枚举i的过程中.将\([lst_ ...