设计模式——组合模式(部分整体模式)
开始介绍之前,先分析一个实例:
编写一个程序展示一个学校院系结构,需要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系:如下:
——————**大学**————————
——————计算机学院———————
计算机科学与技术
软件工程
网络工程
——————信息工程学院————————
通信工程
信息工程
针对上述实例,很容易想到写一个学校类,一个学院类继承学校类,一个专业类继承学院类。对此方法进行分析:
(1)将学院看作是学校的子类,系是学院的子类,实际上是站在组织大小进行分层的,这种方案不能实现较好的管理操作,比如对学院、系的添加删除,遍历等。
(2)解决方案:将学校、院、系都看作是组织结构,他们之间没有继承关系,而是树形结构,可以更好的实现管理操作,即使用组合模式。
基本介绍
(1)组合模式,又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体—部分”的层次关系。
(2)组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
(3)这种类型的设计模式属于树形结构模式。
(4)组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象。
原理图:
说明:
(1)Component:这是组合中对象声明接口,在适当的情况下,实现所有类共有的接口默认行为。用于访问和管理Component子部件,可以是抽象类或者接口。
(2)Leaf:在组合中表示叶子节点,叶子节点没有子节点
(3)Composite:在组合中表示非叶子节点,用于存储子部件,在Composite中实现子部件的相关操作,比如增加,删除。
实例分析
上述实例使用组合模式实现:
// Component
public abstract class OrganizationComponent {private String name;private String description;public OrganizationComponent(String name, String description) {this.name = name;this.description = description;}// 不是所有的子类都需要add,remove,因此提供默认的实现protected void add(OrganizationComponent organizationComponent) {}protected void remove(OrganizationComponent organizationComponent) {}// 所有的子类都需要输出信息,因此做成抽象方法protected abstract void print();public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}}// 相当于Composite,可以管理College
public class University extends OrganizationComponent {List<OrganizationComponent> organizationComponentLists = new ArrayList<>();public University(String name, String description) {super(name, description);}@Overridepublic String getName() {return super.getName();}@Overridepublic String getDescription() {return super.getDescription();}@Overrideprotected void add(OrganizationComponent organizationComponent) {organizationComponentLists.add(organizationComponent);}@Overrideprotected void remove(OrganizationComponent organizationComponent) {organizationComponentLists.remove(organizationComponent);}@Overrideprotected void print() {System.out.println("---------------" + getName() + "----------------");for (OrganizationComponent organization : organizationComponentLists) {organization.print();}}
}public class College extends OrganizationComponent {List<OrganizationComponent> organizationComponentLists = new ArrayList<>();public College(String name, String description) {super(name, description);}@Overridepublic String getName() {return super.getName();}@Overridepublic String getDescription() {return super.getDescription();}@Overrideprotected void add(OrganizationComponent organizationComponent) {organizationComponentLists.add(organizationComponent);}@Overrideprotected void remove(OrganizationComponent organizationComponent) {organizationComponentLists.remove(organizationComponent);}@Overrideprotected void print() {System.out.println("-----" + getName());for (OrganizationComponent organization : organizationComponentLists) {organization.print();}}
}public class Department extends OrganizationComponent {public Department(String name, String description) {super(name, description);}@Overridepublic String getName() {return super.getName();}@Overridepublic String getDescription() {return super.getDescription();}@Overrideprotected void print() {System.out.println(getName());}
}// 主方法
public static void main(String[] args) {University university = new University("***大学", "NB大学");College computerCollege = new College("计算机学院", "计算机学院");College infoEngineerCollege = new College("信息工程学院", "信息工程");computerCollege.add(new Department("计算机科学与技术", "计科"));computerCollege.add(new Department("软件工程", "软件工程"));infoEngineerCollege.add(new Department("通信工程", "通信"));infoEngineerCollege.add(new Department("电子信息", "电子信息"));university.add(computerCollege);university.add(infoEngineerCollege);university.print();}// 运行结果
/**
---------------***大学----------------
-----计算机学院
计算机科学与技术
软件工程
-----信息工程学院
通信工程
电子信息
*/
总结
(1)JDK中HashMap使用了组合模式。简单介绍:
1)Map就是一个抽象的构建(类似Component)
2)HashMap是一个中间的构建(Composite),实现/继承了相关put,putAll等方法。
3)Node是HashMap的静态内部类,类似leaf叶子节点。
(2)简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
(3)具有较强的扩展性。当我们需要改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动。
(4)方便创建出复杂的层析结构。客户端不用理会组合里面的组成细节,容易添加节点或者叶子从而创建出复杂的树形结构。
(5)需要遍历组织机构,或者处理的对象具有树形结构时,非常适合使用组合模式。
(6)需要较高的抽象思维,如果节点和叶子有很多差异性的话,比如很多方法和属性都不一样,不适合使用组合模式。
设计模式——组合模式(部分整体模式)相关推荐
- 组合模式(部分整体模式)—结构型
创建型 1,单例设计模式 2,工厂设计模式 3,建造者设计模式 4,原型设计模式 结构型 5,代理设计模式 6,桥接设计模式 7,装饰设计模式 8,适配器设计模式 9,外观设计模式 10,享元设计模式 ...
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- 大话设计模式—组合模式
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...
- 设计模式---组合模式
设计模式---组合模式 什么是组合模式:Composite? 使用场景 代码示例 组合模式模板 组合模式的安全性和透明性 总结 优缺点: 适用场景: 什么是组合模式:Composite? 计算机的文件 ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...
- 简说设计模式——组合模式
一.什么是组合模式 前面我们讲过Swing(Java进阶篇(六)--Swing程序设计(上)),在Swing中,容器Container和组件如Button.JLabel等等之间的关系就是组合关系,一个 ...
- PHP设计模式——组合器模式
声明:本系列博客参考资料<大话设计模式>,作者程杰. 组合模式(有时候又叫做部分-整体模式),将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对 ...
- 设计模式 -- 组合模式(Composite)
写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初识组合 ...
- 7、大话设计模式--状态模式 、适配器模式、备忘录模式、组合模式、迭代器模式
第十六章:无尽加班何时休--状态模式 状态模式 : 优点: 缺点: 所使用的项目是:工作状态 功能: 界面: 设计思路: 收获: 附: 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出 ...
最新文章
- XamarinSQLite教程添加测试数据
- WMI使用的WIN32_类库名
- Visual.Assist.X.V10.7.1949的汉化破解补丁
- Docker 概念很难理解?一文搞定 Docker 端口绑定
- 包信封问题 以及 最长有序子序列问题
- CNN已老,GNN来了:重磅论文讲述深度学习的因果推理(附资源)
- linux系统字体文件在哪,linux系统安装字体方法教程介绍
- 在win中搭建IOS自动化
- mysql数据抽取_史上最简单的数据抽取
- 通过计算机控制手机,用电脑控制手机的方法
- 小区广播机制(MIB、SIB)
- 开发工具篇——常用开发工具分享
- Express 介绍
- Python每日笔记打卡_day2
- 【渝粤教育】广东开放大学 广东开放大学学习指引 形成性考核 (28)
- smart gesture安装失败_从安装到打印HP 108w操作详解
- OpenStack-Ironic裸金属简介
- hi3516dv300是几核处理器_HI3516DRBCV300-HI3516DRBCV300,hi3516DV300,HI3516-HI3516DRBCV300-香港科威芯电子有限公司...
- cocos creator开发微信小游戏(五)贪吃蛇大作战
- Celery Django 运行 task 任务的时候 提示NotRegistered
热门文章
- 【20210719】【数据分析】使用 Matlab,绘制 Bland-Altman 图,对呼吸率、心率进行误差分析
- Quartus2的实验常用元件
- 爬虫入门(三)进阶技巧之ID遍历、追踪链接
- 人工智能的利弊及如何做能最安全的培养人工智能
- 小羊的八卦日常(智慧杯)
- OpenGL 采样器的比较模式
- Burp Suite Professional 2023.1 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
- 独家 | 数据分析@爱可可-爱生活是否利用机器学习算法运营微博
- Python开发技术详解
- STM32 驱动4.3寸TFT LCD 触摸屏