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

设计模式之组合模式

目录

  • 定义
  • 结构
  • 适用场景
  • 使用示例

定义

       将对象组织成树状层次,通过统一的接口(如Component)管理所有节点(包括叶子节点和容器节点)。叶子节点处理基础操作,容器节点负责组合子节点并递归调用操作。‌

结构

在这里插入图片描述

适用场景

       1、当系统需处理嵌套层级不固定的对象关系时,组合模式通过抽象接口统一叶子节点(基础单元)和容器节点(组合单元)
       2、统一操作复杂对象集合(递归行为需求),对嵌套结构执行跨层级操作时,组合模式屏蔽节点类型差异,简化递归逻辑
       3、简化客户端调用逻辑(接口一致性),当业务要求忽略节点差异时,组合模式提供透明性。

使用示例

       以电商商品分类系统‌价格计算为例。
       定义抽象构件

/*** 抽象构件(商品节点接口)*/
public interface ProductComponent {default void add(ProductComponent item) {throw new UnsupportedOperationException();}double getPrice(); // 统一方法:计算价格default void remove(ProductComponent item) {throw new UnsupportedOperationException();}}

       定义叶子节点

/*** 叶子构件(具体商品)*/
public class Product implements ProductComponent {@Getterprivate String name;private final double price;public Product(String name, double price) {this.name = name;this.price = price;}@Overridepublic double getPrice() {return price;}}

       定义容器节点

/*** 容器构件(商品分类)*/
public class ProductCategory implements ProductComponent {@Getterprivate final String name;private final List<ProductComponent> items = new ArrayList<>();public ProductCategory(String name) {this.name = name;}@Overridepublic void add(ProductComponent item) {items.add(item);}@Overridepublic void remove(ProductComponent item) {items.remove(item);}@Overridepublic double getPrice() {double total = 0;for (ProductComponent item : items) {total += item.getPrice(); // 递归计算子节点价格}return total;}}

       测试

public class Client {public static void main(String[] args) {ProductComponent electronics = new ProductCategory("电子产品");electronics.add(new Product("手机", 2999));electronics.add(new Product("耳机", 399));ProductComponent bundle = new ProductCategory("套装");bundle.add(new Product("充电器", 99));bundle.add(electronics); // 嵌套组合System.out.println(bundle.getPrice()); // 输出:3497}}
http://www.dtcms.com/a/264325.html

相关文章:

  • RabbitMQ:消息队列的轻量级王者
  • 系统安全之大模型案例分析
  • 用openCV实现基础的人脸检测与情绪识别
  • 磐维数据库panweidb3.1.0单节点多实例安装
  • 【Python】断言(assert)
  • 1.MySQL之如何定位慢查询
  • 隔离网络(JAVA)
  • 【前端】vue工程环境配置
  • linux 用户态|内核态打印函数调用进程的pid
  • OEM怎么掌握软件开发能力
  • Linux CentOS环境下Java连接MySQL数据库指南
  • Golang的代码结构设计原则与实践与模式应用
  • 解码知识整理,使您的研究更高效!
  • Java项目:基于SSM框架实现的中学教学管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告】
  • [创业之路-458]:企业经营层 - 蓝海战略 - 重构价值曲线、整合产业要素、创造新需求
  • 软件产品使用说明编写需要注意的内容避坑指南
  • Day 3:Python模块化、异常处理与包管理实战案例
  • 【每天一个知识点】均值偏移(Mean-Shift)
  • 智能客服革新:元智启 AI 如何重塑企业服务体验
  • ctfshow web89-web98(php特性篇)
  • 2023年全国硕士研究生招生考试英语(一)试题总结
  • 【Python基础】13 知识拓展:CPU、GPU与NPU的区别和联系
  • SAP ABAP 中 AMDP 简介及实现方法
  • 【Linux】进程创建——fork()函数深度解析
  • Linux->进程控制(精讲)
  • Ubuntu机器开启root用户远程登录
  • 口重启Spring Boot项目中,通过接口实现应用重启是运维场景中的常见需求。以下是三种主流实现方案及其详细步骤和注意事项:
  • nanoGPT复现——prepare拆解(自己构建词表 VS tiktoken)
  • android实践:Bugly专业版Android SDK集成
  • Docker制作python环境