1.定义

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

2.概述

如果一个对象包含另一个对象的引用,称这样的对象为组合对象。如果将当前组合对象作为一个整体的话,那么它所包含的对象就是该整体的一部分。如果一个对象不包含有其他对象的引用,称这样的对象为个体对象。在编写程序时,我们希望将许多个体对象和组合对象组成树形结构,一次表示部分-整体的层次结构,并借助该层次结构使得用户能够用一致的方式处理个体对象和组合对象。在组成的树形结构中,个体对象和组合对象都是树中的节点,但是组合对象具有其他子节点的节点,个体对象是不具有其他子节点的叶节点,也就是说在树形结构中,组合对象所包含的对象将作为该组合对象的子节点被对待。

3.应用场景

部分、整体场景,如树形菜单,文件、文件夹的管理。

4.模式的结构与使用

组合模式包括三种角色。
抽象组件(Component): 是一个接口(抽象类),该接口(抽象类)定义了个体对象和组合对象需要实现的关于操作其子节点的方法,比如add()、remove()以及getChild()等方法。抽象组件也可以定义个体对象和组合对象用于操作器自身的方法,比如isLeaf()方法等。
Component节点(Component Node): 实现Component接口类的实例,Component节点不仅实现Component接口,而且可以含有其他Component节点或Leaf节点的引用。
Leaf节点(Leaf Node): 实现了Component接口类的实例,Leaf节点实现Component接口,不可以含有其他Component节点或Leaf节点的引用,因此叶节点在实现Component接口有关操作子节点的方法时,比如add(),remove()和getChild()方法,可让方法抛出一个异常,也可以实现为空操作。

1.组合模式的UML类图

2.结构的描述

以下通过一个简单的问题来描述怎样使用组合模式,这个问题就是用组合模式描述连队的军士结构,并计算军饷。一个连队由一个连长,两个排长,6个班长和60个士兵锁构成,一共69人。连长直接指挥2个排长,每个排长直接指挥3个班长,每个班长直接指挥10个士兵。连长的军饷是每月5000,排长是4000元,连长是2000元,士兵是1000元。现在使用功组合模式,让连队的军士形成树形结构,并计算一个班的军饷,一个连的军饷和整个连队的军饷。
1.抽象组件
本问题中,抽象组件(Component)的名字是MilitaryPerson,MilitaryPerson接口的代码如下所示:

import java.util.Iterator;public interface MilitaryPerson {public void add(MilitaryPerson person);public void remove(MilitaryPerson person);public MilitaryPerson getChild(int index);public Iterator<MilitaryPerson> getAllChildren();public boolean isLeaf();public double getSalary();public void setSalary(double salary);
}

2.Composite节点
对于本问题,Composite节点是MilitaryOfficer类的实例,MilitaryOfficer类的代码如下:

import java.util.Iterator;
import java.util.LinkedList;public class MilitaryOfficer implements MilitaryPerson{LinkedList<MilitaryPerson> list;String name;double salary;public MilitaryOfficer(String name, double salary) {this.name = name;this.salary = salary;list=new LinkedList<MilitaryPerson>();}@Overridepublic void add(MilitaryPerson person) {list.add(person);}@Overridepublic void remove(MilitaryPerson person) {list.remove(person);}@Overridepublic MilitaryPerson getChild(int index) {return list.get(index);}@Overridepublic Iterator<MilitaryPerson> getAllChildren() {return list.iterator();}@Overridepublic boolean isLeaf() {return false;}@Overridepublic double getSalary() {return salary;}@Overridepublic void setSalary(double salary) {this.salary=salary;}
}

3.Leaf节点
对于本问题,Leaf节点是MilitarySoldier类的实例,MilitarySoldier类的代码如下所示:

import java.util.Iterator;public class MilitarySoldier implements MilitaryPerson{//由于是叶子节点 无字节点队列double salary;String name;public MilitarySoldier(double salary, String name) {this.salary = salary;this.name = name;}@Overridepublic void add(MilitaryPerson person) {//由于无字节点 空实现}@Overridepublic void remove(MilitaryPerson person) {//由于无字节点 空实现}@Overridepublic MilitaryPerson getChild(int index) {return null;}@Overridepublic Iterator<MilitaryPerson> getAllChildren() {return null;}@Overridepublic boolean isLeaf() {return true;}@Overridepublic double getSalary() {return salary;}@Overridepublic void setSalary(double salary) {this.salary=salary;}
}

4.测试程序

import java.util.Iterator;public class Application {public static void main(String[] args) {MilitaryPerson 连长=new MilitaryOfficer("连长",5000);MilitaryPerson 排长1=new MilitaryOfficer("一排长",4000);MilitaryPerson 排长2=new MilitaryOfficer("二排长",4000);MilitaryPerson 班长11=new MilitaryOfficer("一班长",2000);MilitaryPerson 班长12=new MilitaryOfficer("二班长",2000);MilitaryPerson 班长13=new MilitaryOfficer("三班长",2000);MilitaryPerson 班长21=new MilitaryOfficer("一班长",2000);MilitaryPerson 班长22=new MilitaryOfficer("二班长",2000);MilitaryPerson 班长23=new MilitaryOfficer("三班长",2000);MilitaryPerson []士兵=new MilitarySoldier[60];for (int i = 0; i < 士兵.length; i++) {士兵[i]=new MilitarySoldier("小兵",1000);}连长.add(排长1);连长.add(排长2);排长1.add(班长11);排长1.add(班长12);排长1.add(班长13);排长2.add(班长21);排长2.add(班长22);排长2.add(班长23);for (int i = 0; i < 10; i++) {班长11.add(士兵[i]);班长12.add(士兵[i+10]);班长13.add(士兵[i+20]);班长21.add(士兵[i+30]);班长22.add(士兵[i+40]);班长23.add(士兵[i+50]);}System.out.println("一排的军饷"+ComputerSalary.computerSalary(排长1));System.out.println("一班的军饷"+ComputerSalary.computerSalary(班长11));System.out.println("一连的军饷"+ComputerSalary.computerSalary(连长));}
}class ComputerSalary{//计算工资类public static double computerSalary(MilitaryPerson person){double sum=0;if(person.isLeaf()){sum+=person.getSalary();}else {sum+=person.getSalary();Iterator<MilitaryPerson> iterator = person.getAllChildren();while(iterator.hasNext()){MilitaryPerson p = iterator.next();sum+=computerSalary(p);}}return sum;}
}

5.测试结果展示

5.组合模式的优点

1.组合模式中包含个体对象和组合对象,并形成树形结构,使用户可以方便地处理个体对象和组合对象;
2.组合对象和个体对象实现了相同的接口,用户一般无须区别个体对象和组合对象;

设计模式:(组合模式)相关推荐

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

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

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

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

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

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

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

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

  5. 大话设计模式—组合模式

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

  6. java设计模式 组合_JAVA 设计模式 组合模式

    用途组合模式 (Component) 将对象组合成树形结构以表示"部分-整体"的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构 ...

  7. Java常用设计模式————组合模式

    引言 组合模式,是一种类似递归算法的结构性设计模式,通过以简单的 List ,组合本类对象,实现树状对象结构的"部分.整体"的层次. 它可以让调用程序不需要关心复杂对象与简单对象的 ...

  8. C++设计模式-组合模式

    目录 基本概念 代码与实例 基本概念 个人感觉Qt的对象树就是运用了这种设计模式!!! 当然,只是个人感觉,本人并没有研究Qt的源码 组合模式(Composite):将对象组合成树形结构以表示'部分- ...

  9. [Head First设计模式]生活中学设计模式——组合模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  10. 简说设计模式——组合模式

    一.什么是组合模式 前面我们讲过Swing(Java进阶篇(六)--Swing程序设计(上)),在Swing中,容器Container和组件如Button.JLabel等等之间的关系就是组合关系,一个 ...

最新文章

  1. 整流电路对应的阻抗是多少?
  2. HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)
  3. mysql-5.7.20实用下载、安装和配置方法,以及简单操作
  4. 目标检测评价指标mAP计算
  5. 迷茫在路口——致我的2014
  6. 2019蓝桥杯省赛---java---A---8(修改数组)
  7. 《Python Cookbook 3rd》笔记(2.12):审查清理文本字符串
  8. SpringBoot集成Spring Security(二)注册 、密码加密、修改密码
  9. 引入SpringBoot Jpa依赖后,项目出现警告
  10. Thinkphp3.2.3的主从分离事务问题(坑!!!)
  11. ios图片剪切之圆形头像
  12. Redis后门植入分析报告
  13. VScode远程连接linux
  14. XML注释与取消注释快捷键
  15. 计算机桌面推流,OBS推流PPT电脑桌面投屏
  16. 考研倒计时一幕刷屏!网友:这一定是最接近梦想的人!
  17. Bootstrap3基础 btn-xs/sm... 按钮的四种大小
  18. 怎样把一张图片插入到CAD图纸中呢?
  19. 明日直播| NLPCC workshop百度架构师带你快速上手飞桨NLP
  20. 程序员装B小技巧——管理你的桌面

热门文章

  1. Linux部署SFTP服务
  2. python能开发游戏吗
  3. javascript的findIndex()方法
  4. git 撤销刚才的rebase_撤消git rebase
  5. 用XML创建可排序、分页的数据显示页面
  6. Hystrix之服务降级
  7. 港科夜闻|广州市委常委、南沙区委书记卢一先到香港科技大学(广州)指导开学筹备工作...
  8. HTML网页设计期末课程大作业 :汽车网页——宝马轿车 6页 带背景音乐 学生网页设计作业HTML+CSS+JavaScript学生网页课程设计期末作业下载...
  9. scala linux 环境配置,scala在linux中配置开发环境
  10. java 实现AES CCM模式