当前位置: 首页 > 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.lqws.cn/news/596755.html

相关文章:

  • 将实时流的 H.264(视频)与 G.711A(音频)封装成 MP4 文件
  • 关于量子计算的一份介绍
  • 12【进程间通信——管道】
  • Vue 响应式数据传递:ref、reactive 与 Provide/Inject 完全指南
  • 基于 Three.js 与 WebGL 的商场全景 VR 导航系统源码级解析
  • 遥感云大数据在灾害、水体与湿地领域案例及GPT应用
  • 第八章:LeRobot摄像头配置与应用指南
  • 使用GeoServer发布地图shapefi(.shp)数据
  • Spring Bean的生命周期与作用域详解
  • Vue-17-前端框架Vue之应用基础集中式状态管理pinia(二)
  • AI智能体在用户行为数据分析中有哪些应用?
  • Android 网络全栈攻略(四)—— TCPIP 协议族与 HTTPS 协议
  • Linux基本命令篇 —— grep命令
  • 基于ApachePOI实现百度POI分类快速导入PostgreSQL数据库实战
  • opencv使用 GStreamer 硬解码和 CUDA 加速的方案
  • 【cesium】基于vue-cesium开发地理空间分析应用
  • 在 Vue 3 中,如果需要显示 HTML 标签,可以使用 v-html 指令
  • android stdio 创建 mediaplayertest
  • 零信任安全管理系统产品对比介绍
  • 小米YU7使用UWB技术,厘米级定位精准迎宾,安全防破解无感控车
  • .NET测试工具Parasoft dotTEST:全兼容RMS的测试解决方案
  • 538. 把二叉搜索树转换为累加树
  • 清理 Docker 缓存占用
  • Vue 3.x 使用 “prerender-spa-plugin ” 预渲染实现网站 SEO 优化
  • 透视变换、仿射变换
  • webpack的作用是什么,谈谈你对它的理解?
  • MySQL索引失效问题
  • vue-35(使用 Jest 和 Vue Test Utils 设置测试环境)
  • 折扣点餐对接api应该如何选择?
  • React Native 0.79.4 中 [RCTView setColor:] 崩溃问题完整解决方案