常用设计模式系列(十三)—组合模式

第一节

前言

hello大家好,今年已经过去了一半,年初立下的flag,不知道实现了没有,你的flag改了多少次?无论自己的愿望是否完成,我们都应该怀揣着追逐梦想之心,去尝试突破上一年的自我。我去年的flag虽然也没有实现,但是自己努力去做了,结果其实并不重要,更不要成为自己内心阻挠自己努力的绊脚石,加油,年轻人!

今天学习对象结构型设计模式的最后一章:组合模式,组合模式可以理解为整体+部分,一个整体有多个部分组成,例如一个树由多个主干组成,每个主干又有多个树杈,每个树杈又有多个树叶。

第二节

组合模式

组合(Composite
Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。组合模式一般是用来描述整体与部分的关系,我们可以把它应用到数据结构的树形结构当中,顶层的节点就是根节点,根节点下面可以包含多个树枝节点和多个叶子节点,树枝节点下面又可以包含树枝节点和叶子节点,类似于我们学习数据结构中的树形结构。在组合模式中,整个树形结构中的对象都属于同一种类型,带来的好处就是用户不需要辨别是树枝节点还是叶子节点,可以直接进行操作,给用户的使用带来极大的便利。

在这里插入图片描述

在这里插入图片描述

image

在这里插入图片描述

前两天圣诞节,小张同学为了庆祝过节,跑到了大超市买了很多的菜与肉类,从超市出来,小张同学买了许多的物品,跟超市的售货员要了很大的带子,这个大袋子里装了用中型号袋子装的各种蔬菜、塑料包装的肉卷,小袋子装的散装丸子和小袋子装的火锅底料,中型的带子里又装了许多小袋子,每个小袋子都是一种蔬菜,而小袋子装的盒子里面有三个更小的盒子,每个盒子分别是鸡肉卷、羊肉卷、肥牛卷。这种大袋子套中袋子和物品,中袋子又套小袋子和物品的场景,无论是大袋子还是小袋子还是蔬菜,都属于物品,这种嵌套组合,就是组合模式。

在这里插入图片描述

image

第三节

代码实现

1.编写抽象构件

package com.yang.composite;/*** @ClassName Articles* @Description 抽象构件-物品* @Author IT小白架构师之路* @Date 2020/12/29* @Version 1.0**/
public interface Articles {//计算价格public float calculation();//展示内容方法public void show();
}

2.编写树枝角色

package com.yang.composite;import java.util.ArrayList;
import java.util.List;/*** @ClassName Bags* @Description 树枝构件:袋子* @Author IT小白架构师之路* @Date 2020/12/29* @Version 1.0**/
public class Bags implements Articles {private String name;     //名字private List<Articles> bags = new ArrayList<Articles>();public Bags(String name) {this.name = name;}public void add(Articles c) {bags.add(c);}public void remove(Articles c) {bags.remove(c);}public Articles getChild(int i) {return bags.get(i);}public float calculation() {float s = 0;for (Object obj : bags) {s += ((Articles) obj).calculation();}return s;}public void show() {for (Object obj : bags) {((Articles) obj).show();}}
}

3.编写树叶角色

package com.yang.composite;/*** @ClassName Goods* @Description 树叶构件:商品* @Author IT小白架构师之路* @Date 2020/12/29 16:53* @Version 1.0**/
public class Goods implements Articles {private String name;     //名字private int quantity;    //数量private float unitPrice; //单价//构造方法public Goods(String name, int quantity, float unitPrice) {this.name = name;this.quantity = quantity;this.unitPrice = unitPrice;}public float calculation() {return quantity * unitPrice;}public void show() {System.out.println(name + "(数量:" + quantity + ",单价:" + unitPrice + "元)");}
}

4.编写测试类

package com.yang.composite;/*** @ClassName Client* @Description 客户端测试* @Author IT小白架构师之路* @Date 2020/12/29* @Version 1.0**/
public class Client {public static void main(String[] args) {float s = 0;Bags BigBag, mediumBag, smallRedBag, smallWhiteBag;Goods sp;BigBag = new Bags("大袋子");mediumBag = new Bags("中袋子");smallRedBag = new Bags("红色小袋子");smallWhiteBag = new Bags("白色小袋子");sp = new Goods("菠菜", 2, 7.9f);smallRedBag.add(sp);sp = new Goods("火锅底料", 1, 9.9f);smallRedBag.add(sp);sp = new Goods("羊肉", 2, 38);smallWhiteBag.add(sp);sp = new Goods("红酒", 3, 180);smallWhiteBag.add(sp);sp = new Goods("鸭血", 1, 10);mediumBag.add(sp);mediumBag.add(smallRedBag);sp = new Goods("土豆", 1, 3);BigBag.add(sp);BigBag.add(smallWhiteBag);BigBag.add(mediumBag);System.out.println("您选购的商品有:");BigBag.show();s = BigBag.calculation();System.out.println("要支付的总价是:" + s + "元");}
}

5.运行结果如下

您选购的商品有:土豆(数量:1,单价:3.0元)
羊肉(数量:2,单价:38.0元)
红酒(数量:3,单价:180.0元)
鸭血(数量:1,单价:10.0元)
菠菜(数量:2,单价:7.9元)
火锅底料(数量:1,单价:9.9元)
要支付的总价是:654.7元

第四节

优缺点分析与适用场景

优点

1.组合模式使客户端代码可以统一且通用的处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,简化了调用者的逻辑
2.在组合体内部增加对象变得很轻松,不需要修改源代码来增加新的对象.

缺点:

1.设计的过程中,要考虑满足类之前的通用抽象性,否则无法使用组合模式

2.如果限制具体构建,则很难限制.

3.不容易使用继承的方法来扩展新功能,只能使用别的方式

适用场景

1.当系统中一些对象能够按照一致的方式去处理,例如无限极菜单\无限极权限,需要对象与整体同时使用。

2.需要隐藏组合对象与单个对象不同时,不同的单个对象的特殊方法,也不能被访问到的场景。

3.只需要客户端对抽象构建编程,不需要考虑内部实现的场景。

扫描二维码

关注我吧

IT小白架构师之路

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916197.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916197.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916197.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字节码操作工具——ByteBuddy应用(3)安全检查

一、检测方法名是否符合规范1、代码&#xff08;1&#xff09;MethodLoggerAgentpackage com.example.agent;import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.asm.Advice; import net.bytebuddy.matcher.ElementMatchers;import java.lang.instrument.…

NineData 数据库 DevOps 全面支持 GaussDB,国产化管理再升级!

NineData 数据库 DevOps 平台现已全面兼容 GaussDB 全线产品&#xff08;包括 GaussDB 企业级、DWS 数据仓库、openGauss 开源版&#xff09;&#xff0c;实现一站式管理。无论 GaussDB 实例部署在哪个环境&#xff0c;企业所有开发者都可以通过 NineData 统一访问&#xff0c;…

C++ - 模板进阶

一、非类型模板参数模板参数 分为 类型形参与 非类型形参。 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在 class 或者 typename 之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数…

【质量管理】软件缺陷管理实施方案(专业版)

引言 方案目标与范围 本方案以CMMI量化管理要求与ISO 9000质量体系为框架,核心目标是通过标准化缺陷管理流程实现缺陷全生命周期可控。具体包括:确保软件缺陷在全生命周期中被及时发现与修复,减少其对软件质量、发布计划及用户体验的负面影响;以“零缺陷”为首要目标,针对…

Elasticsearch 讲解及 Java 应用实战:从入门到落地

在数据量爆炸的今天&#xff0c;传统数据库的查询能力越来越难以满足复杂的检索需求。比如电商平台的商品搜索&#xff0c;需要支持关键词模糊匹配、多条件筛选、热门度排序等功能&#xff0c;这时候 Elasticsearch&#xff08;简称 ES&#xff09;就成了最佳选择。作为一款分布…

docker pull weaviate 国内拉取失败的问题

我是校内网&#xff0c;尝试了 改镜像源 (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo vim /etc/docker/daemon.json [sudo] password for ruiy: (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo service docker restart (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo docke…

Vue项目使用Univer Sheets

Univer Excel主页链接&#xff1a;安装步骤 1. 安装 使用预设模式的包管理器安装 - 预设模式&#xff1a;可以理解为开包即用的模式&#xff0c;省去很多配置&#xff0c;当然自由度不如插件模式 pnpm add univerjs/presets univerjs/preset-sheets-core2. 前端代码 <te…

Python day24

浙大疏锦行 python day24 内容&#xff1a; 元组&#xff1a;类比于列表&#xff0c;不过元组的元素不能被修改&#xff0c;显示也是从[]改为了()&#xff0c;其余操作则是和列表类似&#xff0c;且元组是有序的可迭代对象&#xff1a;即可以使用迭代器访问的对象&#xff0c…

Three.js 动画系统入门:Tween.js 与 AnimationMixer 的使用

引言 动画是 Three.js 中增强 3D 场景动态效果的核心技术&#xff0c;能够为用户带来沉浸式体验。Three.js 支持通过 Tween.js 实现简单的属性动画&#xff0c;以及通过 AnimationMixer 处理复杂的混合动画和骨骼动画。本文将深入探讨如何使用 Tween.js 控制 Object3D 的属性动…

装修进度管理系统功能对比:主流工具9选

本文分享了9款常用的装修进度管理软件&#xff0c;包括&#xff1a;1.Worktile&#xff1b;2.中望软件&#xff1b;3.三维家&#xff1b;4.Procore&#xff1b;5.易达装修管理系统&#xff1b;6.装修管家&#xff1b;7.Zoho Projects&#xff1b;8.中建君联&#xff1b;9.一品装…

深度学习篇---预训练模型

在深度学习中&#xff0c;预训练模型&#xff08;Pretrained Model&#xff09; 是提升开发效率和模型性能的 “利器”。无论是图像识别、自然语言处理还是语音识别&#xff0c;预训练模型都被广泛使用。下面从概念、使用原因、场景、作用等方面详细介绍&#xff0c;并结合 Pyt…

Redis ①⑦-分布式锁

分布式锁 分布式锁是锁的一种&#xff0c;都是为了解决多线程/多进程环境下&#xff0c;对共享资源的访问冲突问题。 不过&#xff0c;像 Java 的 synchronized 或者 C 的 mutex 这种锁&#xff0c;都是进程内的锁&#xff0c;而分布式锁则是跨越进程/机器的锁。也就是可以针对…

OpenCV-图像预处理➀【图像颜色空间转换、灰度化实验、二值化处理、镜像翻转 和 仿射变换】

文章目录先言一、图像颜色空间转换1.RGB颜色空间2.颜色加法3.颜色加权加法4.HSV颜色空间5.图像转换&#xff08;cvtColor()&#xff09;二、灰度实验1.灰度图2.图像灰度化&#xff08;最大值法&#xff09;3.图像灰度化&#xff08;平均值法&#xff09;4.图像灰度化&#xff0…

APP逆向 day9 安卓开发基础

一.前言 app逆向当然要学安卓基础啦&#xff01;今天我们来教安卓基础当然&#xff0c;安卓基础不会教的很多&#xff0c;比java还要少&#xff0c;还是那句话&#xff0c;了解就好。 二.安卓环境搭建 2.1 安卓介绍 如果做安卓开发 需要会java代码安卓SDK(安卓提供的内置…

Jmeter的元件使用介绍:(三)配置元件详解02

六、计数器 可以用来做一些变量自增操作。 1、Starting value:定义初始值 2、递增&#xff1a;定义每次执行递增多少 3、Maximum value:定义承受的最大值 4、数据格式&#xff1a;可以不填&#xff0c;也可以定义成000;001;002等等任意格式都行。&#xff08;1&#xff09;如…

JavaWeb学习打卡15(JSP标签、JSTL标签、EL表达式)

EL表达式&#xff1a;${ }获取数据执行运算获取web开发的常用对象在pom.xml 文件中导入JSP、JSTL相关依赖&#xff1a;<!--JSP依赖--><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>java…

7.22数据结构——顺序表

文章目录一、思维导图二、实现顺序表的功能代码head.htest.cmain.c一、思维导图 二、实现顺序表的功能代码 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> //数组的最大长度 #define MAXSIZE …

【如何无限制免费试用 IDEA || Pycharm(JB 全家桶)】

如何无限制免费试用 IDEA || Pycharm(JB 全家桶) 一、目标:解决 JB 全家桶试用时长痛点 如果你是程序员,大概率用过 JetBrains 家的 IDE——IDEA 写 Java、Pycharm 写 Python、WebStorm 做前端,体验确实顶流,但官方 30 天试用到期后,动辄几千的年费实在让人肉痛。 咱…

Qt(资源库和按钮组)

这一节是对上一节的补充&#xff0c;上一节提到QLabel类和QAabstractButton类&#xff0c;这节内容&#xff1a;1.如设置资源库&#xff0c;使用资源设置图片2. 使用按钮组管理多个按钮。一、资源库1. 资源库作用Qt的资源库&#xff08;Resource System&#xff0c;.qrc文件&am…

一道检验编码能力的字符串的题目

#include<iostream> #include<vector> #include<string> using namespace std; int bNum0,gNum0; int findEnd(string& s,int si){int lens.size();//当前字母在哪个字符串中,存入comp中string comp;if(s[si]b||s[si]o||s[si]y){comp"boy";bNu…