Java设计模式 - 组合模式

不断学习才是王道

继续踏上学习之路,学之分享笔记

总有一天我也能像各位大佬一样

原创作品,更多关注我CSDN: 一个有梦有戏的人

准备将博客园、CSDN一起记录分享自己的学习心得!!!

分享学习心得,欢迎指正,大家一起学习成长!

简介

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

组合模式原理

首先先看一下组合的UML图

Compoent:抽象类或者接口,是组合对象声明的接口,实现所有类的默认行为,用于访问、管理子部件。

Leaf:组合中的叶子节点,最小的类

Composite:非叶子节点,用来操作组合对象,存储子部件。

组合模式实例

接下来用一个例子来学习组合模式,学校有学院,学院下有专业,这就是一层一层的关系,需要在一个页面中展现出那个学校有什么学院,学院下有什么专业。

来看一下例子的类图

①、定义抽象类-Component

定义属性,构造器,getset,操作方法需要默认实现,因为在叶子节点是不需要去实现的,如果定义成抽象类,子类就必须实现了。在定义一个抽象类-打印信息。

package com.lyd.demo.composite;

/**
* @Author: lyd
* @Description: 抽象类
* @Date: 2022-08-30
*/
public abstract class OrganizationComponent {
private String name;
private String description;
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;
}
// 添加 - 子类不一定需要实现
public void add(OrganizationComponent organizationComponent) {
throw new UnsupportedOperationException();
}
// 删除 - 子类不一定需要实现
public void remove(OrganizationComponent organizationComponent) {
throw new UnsupportedOperationException();
}
// 打印 - 子类必须去实现
public abstract void print();
}

②、定义叶子类和非叶子类

大学类:非叶子,组合 院系类;定义一个数组来存放组合对象,通过重写操作方法对其进行操作。

package com.lyd.demo.compose;
import com.lyd.demo.composite.OrganizationComponent;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: lyd
* @Description: 学校类 - 继承OrganizationComponent - 组合 院系类
* @Date: 2022-08-30
*/
public class University extends OrganizationComponent {
// 组合 College 类
List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();
public University(String name, String description) {
super(name, description);
}
/**
* 重写add
*/
@Override
public void add(OrganizationComponent organizationComponent) {
organizationComponents.add(organizationComponent);
}
/**
* 重写remove
*/
@Override
public void remove(OrganizationComponent organizationComponent) {
organizationComponents.add(organizationComponent);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDescription() {
return super.getDescription();
}
// 打印包含学院的信息
@Override
public void print() {
System.out.println("< " + getName() + " >");
// 将所有学院信息打印出来
for (OrganizationComponent o : organizationComponents) {
o.print();
}
}
}

学院类:非叶子,组合Department类,定义一个数组来存放组合对象,通过重写操作方法对其进行操作。

package com.lyd.demo.compose;
import com.lyd.demo.composite.OrganizationComponent;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: lyd
* @Description: 学院类
* @Date: 2022-08-30
*/
public class College extends OrganizationComponent {
// 组合 Department 类
List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();
public College(String name, String description) {
super(name, description);
}
/**
* 重写add
*/
@Override
public void add(OrganizationComponent organizationComponent) {
organizationComponents.add(organizationComponent);
}
/**
* 重写remove
*/
@Override
public void remove(OrganizationComponent organizationComponent) {
organizationComponents.add(organizationComponent);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDescription() {
return super.getDescription();
}
// 打印包含学院的信息
@Override
public void print() {
System.out.println("< " + getName() + " >");
// 将所有专业信息打印出来
for (OrganizationComponent o : organizationComponents) {
o.print();
}
}
}

专业类:叶子节点,没有组合的集合,所以不需要进行操作,只需要进行输出打印。

package com.lyd.demo.compose;
import com.lyd.demo.composite.OrganizationComponent;
/**
* @Author: lyd
* @Description: 专业类
* @Date: 2022-08-30
*/
public class Department extends OrganizationComponent {
// 已经没有集合了
public Department(String name, String description) {
super(name, description);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDescription() {
return super.getDescription();
}
// 叶子节点,就不需要add和remove
@Override
public void print() {
System.out.println(getName());
}
}

③、测试

package com.lyd.demo.test;
import com.lyd.demo.compose.College;
import com.lyd.demo.compose.Department;
import com.lyd.demo.compose.University;
import com.lyd.demo.composite.OrganizationComponent;
/**
* @Author: lyd
* @Description: 测试
* @Date: 2022-08-30
*/
public class ComposeTest {
public static void main(String[] args) {
// 创建大学
OrganizationComponent ZheJiangUniversity = new University("浙江大学", "人才之地");
// 创建学院
OrganizationComponent ComputerCollege = new College("计算机科学与技术学院", "-->计算机科学与技术学院");
OrganizationComponent OpticalCollege = new College("光电科学与工程学院", "-->光电科学与工程学院");
// 创建专业
Department ComputerDepartment = new Department("计算机科学与技术", "--计算机科学与技术");
Department SoftWareDepartment = new Department("软件工程", "--软件工程");
Department OpticalDepartment = new Department("光电信息科学与工程", "--光电信息科学与工程");
// 添加专业
ComputerCollege.add(ComputerDepartment);
ComputerCollege.add(SoftWareDepartment);
OpticalCollege.add(OpticalDepartment);
// 添加学院
ZheJiangUniversity.add(ComputerCollege);
ZheJiangUniversity.add(OpticalCollege);
// 打印所有
ZheJiangUniversity.print();
System.out.println("*******************************");
// 打印学院
ComputerCollege.print();
System.out.println("*******************************");
// 打印院系
ComputerDepartment.print();
}
}

组合可以理解成是层层相套。

运行结果:

通俗的讲,组合模式就是将对象组合到非类中,在非子类中进行对他们的操作,有种层层相套的感觉,可以通过打断点的形式一步一步了解。

创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!

【设计模式】Java设计模式 - 组合模式的更多相关文章

  1. java23种设计模式——八、组合模式

    目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模式 java23种设计模式-- ...

  2. JAVA设计模式初探之组合模式

    先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.” 就拿剪发办卡的事情来分析一下吧. 首先,一张卡可以在总部,分店, ...

  3. java 之 组合模式(大话设计模式)

    代码是一门艺术,每次看完大话设计模式后都会有新的认识,有时会感叹原来还可以这样玩,相信大家都用过递归,递归的使用一般遍历文件夹等会常用到, 今天讲的设计模式类似于递归,也比较神奇,先看下类图,稍后再帮 ...

  4. Java设计模式学习记录-组合模式

    前言 今天要介绍的设计模式是组合模式,组合模式也是结构型设计模式的一种,它主要体现了整体与部分的关系,其典型的应用就是树形结构.组合是一组对象,其中的对象可能包含一个其他对象,也可能包含一组其他对象. ...

  5. java设计模式-----13、组合模式

    Composite模式也叫组合模式,是构造型的设计模式之一.通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树. 组合(Composite)模式的其它翻译名称也很多,比如合成模式.树 ...

  6. Java设计模式之《组合模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6489827.html 组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是 ...

  7. JAVA设计模式之【组合模式】

    组合模式 用面向对象的方式来处理树形结构 组合多个对象形成树形结构以表示具有"整体-部分"关系的层次结构. 在组合模式中引入了抽象构件类Component,它是所有容器类和叶子类的 ...

  8. Java描述设计模式(10):组合模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.文件系统 下图是常见的计算机文件系统的一部分. 文件系统是一个树结构,树上长有节点.树的节点有两种: 树枝节点 即文件夹,有 ...

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

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

  10. Java---23种设计模式(九)------组合模式

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

随机推荐

  1. java常见的面试题(一)

    1.Collection 和 Collections 有什么区别? Collection 是一个集合接口(集合类的一个顶级接口).它提供了对集合对象进行基本操作的通用接口方法.Collection接口 ...

  2. git的工作原理和git项目创建及克隆

    Git基本理论(重要)三个区域Git本地有三个工作区域:工作目录(Working Directory).暂存区(Stage/Index).资源库(Repository或Git Directory).如 ...

  3. Eolink家族成员回归 — 开源服务Eoapi!

    Eolink 开源产品又回来了!Eoapi 自 2016 年上架 Github 以来,一直备受国内外开发者的欢迎和好评 ,在2018年 Eolink 为了进一步升级该产品而进行了暂时下架.时隔四年,E ...

  4. CMU15445 (Fall 2019) 之 Project#4 - Logging & Recovery 详解

    前言 这是 Fall 2019 的最后一个实验,要求我们实现预写式日志.系统恢复和存档点功能,这三个功能分别对应三个类 LogManager.LogRecovery 和 CheckpointManag ...

  5. 数据类型 简单扩展(Java)

    public class HelloWorld { public static void main(String[] args) { //整数拓展 进制 二进制0b 十进制 八进制0 十六进制0x i ...

  6. Gorgerous -「歌词」留言板

    歌者,献祭「心声」,以沐浴「新生」. Oh love. How I miss you every single days when I see you on those streets. Oh lov ...

  7. 中国顶级程序员,从金山WPS走出来,自研了“表格编程”神器

    程序员的圈子里有很多如明星般闪耀的牛人! 有中国"第一代程序员"--求伯君,有在微信获得巨大成功的张小龙,有图灵奖获得者姚期智,有商业巨子张一鸣,更有开源影响力人物--章亦春. 章 ...

  8. 第46届ICPC澳门站 K - Link-Cut Tree // 贪心 + 并查集 + DFS

    原题链接:K-Link-Cut Tree_第46屆ICPC 東亞洲區域賽(澳門)(正式賽) (nowcoder.com) 题意: 要求一个边权值总和最小的环,并从小到大输出边权值(2的次幂):若不存在 ...

  9. Netty源码解读(二)-服务端源码讲解

    简单Echo案例 注释版代码地址:netty 代码是netty的源码,我添加了自己理解的中文注释. 了解了Netty的线程模型和组件之后,我们先看看如何写一个简单的Echo案例,后续的源码讲解都基于此 ...

  10. Linux系统上传公钥不生效问题

    Authentication refused: bad ownership or modes for file /home/yanbo.xu/.ssh/authorized_keys 原因: sshd ...