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. 到点了开始网抑云(悲)但是用python(整活)

    写在前面的一点网抑云: 爱情不是随便许诺好了不想再说了没错 是我那么多的冷漠 让你感觉到无比的寂寞不过 一个女人的不仅仅渴望得到的一个承诺我害怕欺骗也害怕寂寞更害怕我的心会渐渐地凋落爱情不是随便许诺好 ...

  2. 用python制作文件搜索工具,深挖电脑里的【学习大全】

    咳咳~懂得都懂啊 点击此处找管理员小姐姐领取正经资料~ 开发环境 解释器: Python 3.8.8 | Anaconda, Inc. 编辑器: pycharm 专业版 先演示效果 开始代码,先导入模 ...

  3. C#中将字符串转换成数值

    Convert.ToInt32("999");

  4. P2599 [ZJOI2009]取石子游戏 做题感想

    题目链接 前言 发现自己三岁时的题目都不会做. 我发现我真的是菜得真实. 正文 神仙构造,分讨题. 不敢说有构造,但是分讨我只服这道题. 看上去像是一个类似 \(Nim\) 游戏的变种,经过不断猜测结 ...

  5. 链表设计与Java实现,手写LinkedList这也太清楚了吧!!!

    链表设计与实现 在谈链表之前,我们先谈谈我们平常编程会遇到的很常见的一个问题.如果在编程的时候,某个变量在后续编程中仍需使用,我们可以用一个局部变量来保存该值,除此之外一个更加常用的方法就是使用容器了 ...

  6. 数据结构-查找-二叉排序查找(平衡二叉树,B树,B+树概念)

    0.为什么需要二叉排序树 1)数组存储方式: 优点:通过下标访问元素,速度快,对于有序数组,可以通过二分查找提高检索效率: 缺点:如果检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低: 2 ...

  7. 大家好,我是UCMP云管家,这是我的自我介绍

    随着云计算的不断普及,构建在计算.存储.网络.数据库等基础资源之上的云平台逐渐大行其道:而随着多种云平台技术路线的发展成熟,多个云厂商的云平台开始出现在企业IT市场.对于企业而言,为满足成本.按需.隐 ...

  8. 7 什么是dubbo

    什么是dubbo 快速入门dubbo 了解什么是dubbo之前,我们得先了解什么是分布式系统? <分布式系统原理与范型>定义: 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像 ...

  9. VS Code + GitHub

    来到博客园学着别人美化了一下自己的博客页面,蛮好看的,然后右上角有一个"Fork me on GitHub".之前就因为好奇而注册过GitHub,但一直不会使,现在正式开始编程学习 ...

  10. Ask.com用过什么名字?

    搜索引擎 Ask.com 曾是美国第三,世界第六大公网搜索引擎,仅次于 Google 搜索.Bing 和百度.NAVER.Yandex. Ask.com 曾经用过什么名字? Ask Jetson As ...