当前位置: 首页 > news >正文

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

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

第一节

前言

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.dtcms.com/a/297318.html

相关文章:

  • Oracle 的单体安装
  • Android Room 持久化库:简化数据库操作
  • Kingbasepostgis 安装实践
  • GaussDB 逻辑备份实操
  • AR眼镜重塑外科手术导航:精准“透视”新突破
  • Elasticsearch-8.17.0 centos7安装
  • 《Angular+Spring Boot:ERP前端采购销售库存协同架构解析》
  • AR与AI融合:医疗诊断的智能新引擎
  • 解决angular与jetty websocket 每30s自动断连的问题
  • 安装pyarrow包
  • 小程序安卓ApK转aab文件详情教程MacM4环境
  • 好看的小程序推广单页HTML源码 可用作导航页
  • 教培机构如何开发自己的证件照拍照采集小程序
  • SaaS型小程序自动化发布解决方案
  • java面试题1
  • 淘宝扭蛋机小程序系统开发:重塑电商互动模式
  • 车身域控制器MCU市场报告:解析行业现状与未来趋势
  • 小程序卡顿到丝滑体验:ZKmall开源商城性能优化与兼容修复实战指南
  • C++ Proactor 与 Reactor 网络编程模式
  • 自动驾驶训练-tub详解
  • 医疗专用电源滤波器:保障设备稳定运行,守护患者安全
  • OAuth 2.0 安全最佳实践 (RFC 9700) password 授权类型已经不推荐使用了,将在计划中移除
  • 图片查重从设计到实现(4)图片向量化存储-Milvus 单机版部署
  • 【lucene】AttributeSource概述
  • 【13】C# 窗体应用WinForm——.NET Framework、WinForm、工程创建、工具箱简介、窗体属性及创建
  • Python Multiprocessing 进程池完全教程:从理论到实战
  • Qlora+DPO微调Qwen2.5
  • Python捕获异常
  • Yolov8/Yolov11实例分割训练自有数据集
  • Springboot项目实现将文件上传到阿里云