组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

大话设计模式中程杰老师给出的定义是,组合模式:将对象组合成树形结构以表示”部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性

组合模式结构图:

首先,让我们通过过一个简单的实例来简单了解一下组合模式做基本的用法。实例演示了一个组织中员工的层次结构。

创建Employee类:

package com.exercise.composite;import java.util.ArrayList;
import java.util.List;public class Employee {private String name;private String dept;private int salary;private List<Employee> subordinates;//部下//constructorpublic Employee(String name, String dept, int salary,List<Employee> subordinates) {super();this.name = name;this.dept = dept;this.salary = salary;this.subordinates = subordinates;subordinates = new ArrayList<Employee>();}public Employee(String name, String dept, int salary) {super();this.name = name;this.dept = dept;this.salary = salary;subordinates = new ArrayList<Employee>();}public void add(Employee e){subordinates.add(e);}public void remove(Employee e){subordinates.remove(e);}public List<Employee> getSubordinates(){return subordinates;}public String toString(){return "Employee :[ Name : " + name + ", dept : " + dept + ", salary :"+ salary + " ]";}
}

测试类:

package com.exercise.composite;
/*** 使用Employee来创建和打印员工的层次结构* @author lmb**/
public class CompositePatternDemo {public static void main(String[] args) {Employee CEO = new Employee("John","CEO", 30000);Employee headSales = new Employee("Robert","Head Sales", 20000);Employee headMarketing = new Employee("Michel","Head Marketing", 20000);Employee clerk1 = new Employee("Laura","Marketing", 10000);Employee clerk2 = new Employee("Bob","Marketing", 10000);Employee salesExecutive1 = new Employee("Richard","Sales", 10000);Employee salesExecutive2 = new Employee("Rob","Sales", 10000);CEO.add(headSales);CEO.add(headMarketing);headSales.add(salesExecutive1);headSales.add(salesExecutive2);headMarketing.add(clerk1);headMarketing.add(clerk2);//打印该组织的所有员工System.out.println("-------------------公司员工情况----------------------");System.out.println(CEO);for (Employee headEmployee : CEO.getSubordinates()) {//打印CEO的直属一级部下System.out.println(headEmployee);for (Employee employee : headEmployee.getSubordinates()) {//打印CEO的二级部下System.out.println(employee);}} }}

运行结果:

使用场景:

需求中是体现部分与整体层次结构的时候,以及当我们希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时。简而言之,就是涉及到部分、整体场景时,如树形菜单,文件、文件夹的管理。

主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

一般在工作中说起部分和总体我们想到最多的大概就是总公司和分公司了,如果我们需要做一套办公管理系统,并且总公司的人力资源部、财务部等的办公挂历功能在所有的分公司也都要有,我们该怎么实现?

功能实现:

抽象公司类或接口

package com.composite;public abstract class Company {protected String name;public Company(String name){this.name = name;}public abstract void add(Company company);//addpublic abstract void remove(Company company);//removepublic abstract void display(int depth);//displaypublic abstract void lineofDuty();//line of duty}

具体公司类(树枝节点)

package com.composite;import java.util.ArrayList;
import java.util.List;public class ConcreteCompany extends Company {private List<Company> childrenCompany = new ArrayList<Company>();public ConcreteCompany(String name) {super(name);}@Overridepublic void add(Company company) {childrenCompany.add(company);}@Overridepublic void display(int depth) {System.out.println("第 " + depth + " 层的机构名为: " + name);for (Company c : childrenCompany) {c.display(depth + 1);}}@Overridepublic void lineofDuty() {for (Company c : childrenCompany) {c.lineofDuty();}}@Overridepublic void remove(Company company) {childrenCompany.remove(company);}}

财务部和人力资源部(树叶节点)

package com.composite;public class HRDepartment extends Company {public HRDepartment(String name) {super(name);}@Overridepublic void add(Company company) {}@Overridepublic void display(int depth) {System.out.println("第 " + depth + " 层的机构名为: " + name);}@Overridepublic void lineofDuty() {System.out.println(name + "    负责员工招聘管理培训");}@Overridepublic void remove(Company company) {}}
package com.composite;public class FinanceDepartment extends Company {public FinanceDepartment(String name) {super(name);}@Overridepublic void add(Company company) {}@Overridepublic void display(int depth) {System.out.println("第 " + depth + " 层的机构名为: " + name);}@Overridepublic void lineofDuty() {System.out.println(name + "   负责公司财务收支管理");}@Overridepublic void remove(Company company) {}}

测试方法

package com.composite;public class CompositePatternDemo {public static void main(String[] args) {//一个总公司ConcreteCompany root = new ConcreteCompany("北京总公司");root.add(new HRDepartment("总公司人力资源部"));root.add(new FinanceDepartment("总公司财务部"));//三个子公司ConcreteCompany com1 = new ConcreteCompany("广州分公司");com1.add(new HRDepartment("广州分公司人力资源部"));com1.add(new FinanceDepartment("广州分公司财务部"));root.add(com1);ConcreteCompany com2 = new ConcreteCompany("杭州分公司");com2.add(new HRDepartment("杭州分公司人力资源部"));com2.add(new FinanceDepartment("杭州分公司财务部"));root.add(com2);ConcreteCompany com3 = new ConcreteCompany("深圳分公司");com3.add(new HRDepartment("深圳分公司人力资源部"));com3.add(new FinanceDepartment("深圳分公司财务部"));root.add(com3);System.out.println("-------公司结构图--------");root.display(1);System.out.println("----------各部门职责----------");root.lineofDuty();}}

运行结果:

这样,通过组合模式我们就定义了包含人力资源部和财务部这些基本对象和分公司等组合对象的类层次结构。

基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去,在客户代码中,任何用到基本对象的地方都可以使用组合对象了。组合模式让客户可以一致的使用组合结构和单个对象。

应用实例:

1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作树、操作符和另一个操作数。

2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。

优点:

1、高层模块调用简单。
2、节点自由增加。

缺点:

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

大话设计模式—组合模式相关推荐

  1. linkin大话设计模式--桥接模式

    linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...

  2. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  3. 设计模式---组合模式

    设计模式---组合模式 什么是组合模式:Composite? 使用场景 代码示例 组合模式模板 组合模式的安全性和透明性 总结 优缺点: 适用场景: 什么是组合模式:Composite? 计算机的文件 ...

  4. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  5. Java设计模式 —— 组合模式(Composite)

    Java设计模式 -- 组合模式(Composite) 定义 Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性. ...

  6. JS设计模式--组合模式

    JS设计模式–组合模式 昨天学习了白贺翔老师的JS组合模式,现在把我学到的分享出来叭O(∩_∩)O,直接看下面代码 <!DOCTYPE html> <html lang=" ...

  7. 7、大话设计模式--状态模式 、适配器模式、备忘录模式、组合模式、迭代器模式

    第十六章:无尽加班何时休--状态模式 状态模式 :   优点: 缺点: 所使用的项目是:工作状态 功能: 界面: 设计思路: 收获: 附: 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出 ...

  8. 设计模式----组合模式UML和实现代码

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是组合模式? 组合模式(Composite)定义:将对象组合成树形结构以表示'部分---整体'的层次结构.组合模式使得 ...

  9. 大话设计模式—建造者模式

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类会一步一步构造最 ...

最新文章

  1. NSURLConnection的简单使用
  2. SharpDevelop 5.1 调试一个简单会员管理系统
  3. Anaconda建立新的环境,出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url 解决过程
  4. 【Linux 报错】com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The las
  5. 批处理文件检测windows系统是32位还是64位
  6. Java笔记-JNI中简单的参数与返回值处理
  7. 公司安排员工扫地,引发员工不满,程序员:保洁阿姨都请不起?
  8. 把可视化放到年终报告里,到底有多赞?
  9. 谈谈我自己为什么突然想写技术博客
  10. iPhone4S安装Linux系统,别失望太早 iPhone 4S其实就是iPhone 5
  11. 谈谈运维监控那些事儿
  12. Gradle编译spring3.x报错找不到itextpdf4.2.2解决方案
  13. 用虚拟串口进行串口调试
  14. 发现一个好用的层级多项目管理工具
  15. 生活中的逻辑谬误03.滑坡谬误
  16. 大学四年,我做过哪些兼职
  17. 127:vue+openlayers 使用CRTL控制map拖拽和鼠标滚动 (示例代码)
  18. windows7远程桌面
  19. JME2 和JME3的比较
  20. 网红品牌的“敦刻尔克大撤退”

热门文章

  1. 大话西游之Office应用实例系列! 13
  2. cisco路由器基本实验之九 PAT的配置(Packet Tracer)
  3. Sysnoise5.6安装教程
  4. Java调用js方法
  5. RobotFramework自动化框架—robot文件中调用自定义库
  6. 系列(四)—Http协议
  7. 学习笔记之-Activiti7工作流引擎,概述,环境搭建,类关系图,使用Activiti BPMN visualizer,流程变量,组任务 网关,Activiti整合Spring SpringBoot
  8. 自动规避代码陷阱——自定义Lint规则
  9. js node.js 编写命令工具demo
  10. SQL中的long text