组合模式中的“整体与部分”你真的清楚吗?
组合模式
今天来学习23种设计模式的第八种——组合模式,组合模式主要用于组合多个对象形成树形结构以表示“整体-部分”的结构层次。
概念:
组合模式(Composite Pattern)又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型设计模式。
特点:
优点:
- 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码。
- 容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”。
缺点:
- 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
类图分析:
代码:
package cn.ppdxzz.composite;
/*** Description:抽象类,实现所有类共有的接口默认行为** @Date: 2020/4/8* @Author: PeiChen JavaAnything*/
public abstract class OrganizationComponent {private String name;//名称private String description;//描述protected void add(OrganizationComponent organizationComponent) {//默认实现throw new UnsupportedOperationException();}protected void remove(OrganizationComponent organizationComponent) {//默认实现throw new UnsupportedOperationException();}//抽象方法,子类都需实现protected abstract void print();public OrganizationComponent() {}public OrganizationComponent(String name, String description) {this.name = name;this.description = description;}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;}
}
系别
package cn.ppdxzz.composite;/*** Description:系别** @Date: 2020/4/8* @Author: PeiChen JavaAnything*/
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());}
}
学院
package cn.ppdxzz.composite;import java.util.ArrayList;
import java.util.List;/*** Description:学院** @Date: 2020/4/8* @Author: PeiChen JavaAnything*/
public class College extends OrganizationComponent {//List集合用于存放系别List<OrganizationComponent> organizationComponents = new ArrayList<>();public College(String name,String description) {super(name, description);}//添加系别@Overrideprotected void add(OrganizationComponent organizationComponent) {organizationComponents.add(organizationComponent);}//移除系别@Overrideprotected void remove(OrganizationComponent organizationComponent) {organizationComponents.remove(organizationComponent);}//输出系别信息@Overrideprotected void print() {System.out.println("---" + getName() + "---");organizationComponents.forEach(OrganizationComponent::print);}@Overridepublic String getName() {return super.getName();}@Overridepublic String getDescription() {return super.getDescription();}
}
学校
package cn.ppdxzz.composite;import java.util.ArrayList;
import java.util.List;/*** Description:学校** @Date: 2020/4/8* @Author: PeiChen JavaAnything*/
public class University extends OrganizationComponent {//List集合存放College学院List<OrganizationComponent> organizationComponents = new ArrayList<>();public University(String name,String description) {super(name, description);}//添加学院@Overrideprotected void add(OrganizationComponent organizationComponent) {organizationComponents.add(organizationComponent);}//删除学院@Overrideprotected void remove(OrganizationComponent organizationComponent) {organizationComponents.remove(organizationComponent);}//输出学院信息@Overrideprotected void print() {System.out.println("---" + getName() + "---");organizationComponents.forEach(OrganizationComponent::print);}@Overridepublic String getName() {return super.getName();}@Overridepublic String getDescription() {return super.getDescription();}
}
测试
package cn.ppdxzz.composite;/*** Description:组合模式(学校院系展示问题)** @Date: 2020/4/8* @Author: PeiChen JavaAnything*/
public class Client {public static void main(String[] args) {//创建学校OrganizationComponent university = new University("大学","大学很美");//创建学院OrganizationComponent college1 = new College("电子信息工程学院","这是计算机学院");OrganizationComponent college2 = new College("外语学院","这是外语学院");//创建各个学院下面的系别college1.add(new Department("计科系","它很强"));college1.add(new Department("电子系","它很强"));college2.add(new Department("英语系","这是英语系"));college2.add(new Department("韩语系","这是韩语系"));//添加学院到学校university.add(college1);university.add(college2);university.print();}
}
演示:
总结:
- 简化客户端的操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
- 具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动。
- 需要遍历组织机构,或者处理的对象具有树形结构时,非常适合使用组合模式。
- 组合模式要求较高的抽象性,如果节点和叶子有很多差异性的话,比如很多方法和属性都不一样,不适合使用组合模式。
- Java 的集合类 HashMap 中就使用到了组合模式。
虽然组合模式能够清晰地定义分层次的复杂对象,也使得增加新构件也更容易,但是这样就导致了系统的设计变得更加抽象,如果系统的业务规则比较复杂的话,使用组合模式就有一定的挑战了。
我们只需要调整内部的层次关系,客户端不用做出任何改动。
- 需要遍历组织机构,或者处理的对象具有树形结构时,非常适合使用组合模式。
- 组合模式要求较高的抽象性,如果节点和叶子有很多差异性的话,比如很多方法和属性都不一样,不适合使用组合模式。
- Java 的集合类 HashMap 中就使用到了组合模式。
虽然组合模式能够清晰地定义分层次的复杂对象,也使得增加新构件也更容易,但是这样就导致了系统的设计变得更加抽象,如果系统的业务规则比较复杂的话,使用组合模式就有一定的挑战了。
微信公众号,JavaAnything,期待你的关注!
组合模式中的“整体与部分”你真的清楚吗?相关推荐
- 设计模式——组合模式(部分整体模式)
开始介绍之前,先分析一个实例: 编写一个程序展示一个学校院系结构,需要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系:如下: ------**大学**-------- ---- ...
- js中的设计模式之组合模式
Js中的组合模式 定义 是一种将对象组合成树状结构的层次结构模式,用来表示 整体-部分 的关系,使用用户对单个对象和组合对象具有一致的访问性. 详细描述 组合模式是一个树形结构,里面的数据可以是单个对 ...
- Mybatis中SqlNode的组合模式
组合( Composite )模式就是把对象组合成树形结构,以表示"部分-整体"的层次结构,用户可以像处理一个简单对象一样来处理一个复杂对象,从而使得调用者无需了解复杂元素的内部结 ...
- 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之组合模式
· 组合模式在王者荣耀中的应用 · 一.简述 王者荣耀有非常多的英雄,而且每一个不同的英雄也有其自己对应的皮肤.玩家可以根据需要购买不同的英雄皮肤,体验不同英雄皮肤在对局中的感受. 在本实例中,根据组 ...
- 管道过滤器模式(Pipe and Filter)与组合模式(修改)
之前在 benjielin 前辈的博客中看到"管道过滤器(Pipe-And-Filter)模式(http://bj007.blog.51cto.com/1701577/345677)&quo ...
- javascript设计模式-组合模式
1 <!DOCTYPE HTML> 2 <html lang="en-US"> 3 <head> 4 <meta charset=&quo ...
- 【设计模式】组合模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.组合模式简介 二.组合模式适用场景 三.组合模式优缺点 四.组合模式和访问者模式 五.组合模式代码示例 1.书籍和目录的抽象父类 2.书籍类 3.目录类 4.测试类 一.组合模式简介 组 ...
- 组合模式——透明组合模式,安全组合模式
组合模式 概述 叶子节点进行相关的操作. 可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象. 但是由于容器对象和叶子对象在功能上面的区别,使得我们 ...
- 《研磨设计模式》chap15 组合模式(2)改写示例+总结
1. 改写示例 在添加子组件的方法实现中,加入对父组件的引用实现.在删除子组件的方法实现中,加入把被删除的商品类别对象的父商品类别,设置成为被删除的商品类别的子类别的父商品类别的功能.实现新的返回组件 ...
- 1、【设计模式】组合模式
java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆] 树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...
最新文章
- 门面设计模式php,php设计模式-门面模式(Facade Pattern)
- HTTP API领域在围绕OAS进行整合
- mybatis-plus (3.4.2)使用
- 【英语学习】【WOTD】hypermnesia 释义/词源/示例
- [51单片机] 定时器3-计时示例
- 从0开始写JavaWeb框架系列(1)从0开始写SamrtFrameWork:读取配置文件
- 柔性穿刺针有限元模型
- 网站流量少的原因及解决方案
- 第四章.深入类的方法
- An'droid TextView
- android studio 打包生成apk文件
- Ubuntu安装邮件服务器
- 明明很努力的写博客,为啥没人看?试试这些方法和工具(建议收藏)
- Google Chrome 66可以下载啦
- JAVA留言板系统(java留言板系统)java留言管理系统
- flowci php,我和flow.ci的第一次亲密接触
- 电子DIY创意——简单的旋转灯
- No module named '_sqlite3'
- 无速度矢量控制+飞车启动,全速度段可追踪,s functin,纯C代码,大厂内部资料,可移植DSP28X系列。
- MySql 之定时备份数据库
热门文章
- iPhone如何恢复出厂设置?苹果手机恢复出厂设置教程【3种方法】
- 计算机系统应用属于ei,2018年度中心成员发表论文清单(SCI、EI收录)
- 电脑怎么打出冒号符号_中文标点--符号--键位--用电脑怎么打出来
- Eclipse Theia:Eclipse的继承者?
- 创业19年的湖南竞网如何拥抱数字化转型,按下成长加速键?
- 2021年中国DevOps现状调查报告发布!
- 微信红包在微信公账号平台如何进行配置
- 新年计算机语言祝福语,新春祝福语
- B. Shashlik Cooking
- adc0832工作原理详解_ADC0832内部原理