Java 23 种设计模式:从踩坑到精通 | 番外:组合 vs 解释器 —— 结构树 vs 计算树
Java 23 种设计模式从踩坑到精通 | 番外组合 vs 解释器 —— 结构树 vs 计算树摘要组合模式和解释器模式都用到了树形结构但组合模式的树是“结构树”——叶子与容器行为统一客户端一致处理解释器模式的树是“计算树”——每种节点有独立的求值逻辑通过递归计算得出结果。本文从文件系统管理器和四则运算计算器两个场景出发结合代码对比、UML 分析和 JDKPattern、Spring SpEL 源码帮你彻底分清这对“树形结构型”模式。️本文阅读地图3 分钟速览为什么文件系统是组合模式表达式求值是解释器模式UML 对比统一操作 vs 递归求值手写文件系统管理器 vs 四则运算计算器看代码感受差异组合模式中的operation()和解释器中的interpret()本质区别面试必问“组合和解释器都用了树到底有什么区别”《Java 23 种设计模式从踩坑到精通》开篇系列介绍与目录 当前番外 · 组合 vs 解释器 返回系列总目录文章目录Java 23 种设计模式从踩坑到精通 | 番外组合 vs 解释器 —— 结构树 vs 计算树1. 从“文件系统”和“四则运算”两个场景说起1.1 场景一文件系统管理器组合模式1.2 场景二四则运算计算器解释器模式1.3 关键差异已浮现2. UML 对比3. 三大核心区别4. JDK 源码深度对比4.1 AWT 组件树组合模式4.2 Java 正则表达式解释器模式5. 组合模式可以作为解释器模式的“基础结构”6. 面试必问 追问连环炮 《Java 23 种设计模式从踩坑到精通》快速导航1. 从“文件系统”和“四则运算”两个场景说起1.1 场景一文件系统管理器组合模式假设你在开发一个文件管理系统需要展示文件夹和文件的层级结构。文件夹里可以有文件也可以有子文件夹。你需要递归展示整个目录树但不管是文件还是文件夹对客户端来说最好能统一操作。// 组合模式统一处理叶子文件和容器文件夹FileSystemNoderootnewFolderNode(root);FileSystemNodedocsnewFolderNode(docs);FileSystemNodefile1newFileNode(readme.txt);FileSystemNodefile2newFileNode(image.png);root.add(docs);docs.add(file1);docs.add(file2);// 客户端不用区分文件和文件夹统一调用 show()root.show(0);// 输出// 文件夹root// 文件夹docs// 文件readme.txt// 文件image.png白话客户端只调用show()不管是文件还是文件夹都照常执行。组合模式的核心是统一叶子与容器的接口让客户端一致处理。1.2 场景二四则运算计算器解释器模式现在你要实现一个表达式计算器能够解析并计算a b - c这样的表达式。变量a、b、c是叶子节点、-是运算符节点。你需要根据语法规则递归求值。// 解释器模式构建语法树递归求值ContextctxnewContext();ctx.setVariable(a,10);ctx.setVariable(b,5);ctx.setVariable(c,2);// 构建语法树a b - cExpressionexpressionnewSubtract(newAdd(newVariable(a),newVariable(b)),newVariable(c));intresultexpression.interpret(ctx);System.out.println(a b - c result);// 13白话Add节点和Subtract节点各自有自己的求值逻辑Variable节点直接取值。每种节点的interpret()行为完全不同。解释器模式的核心是每种节点有独立的计算逻辑通过递归得出最终结果。1.3 关键差异已浮现组合模式文件和文件夹的show()行为相似——都是展示自己文件夹多了遍历子节点解释器模式Add.interpret()做加法Subtract.interpret()做减法Variable.interpret()取值——行为完全不同。2. UML 对比3. 三大核心区别对比维度组合模式解释器模式树的性质结构树——表示部分-整体层次关系计算树——表示语法规则和求值逻辑节点行为operation()统一——叶子与容器行为相似interpret()各不相同——每种节点求值逻辑不同是否管理子节点✅ 容器有add()/remove()❌ 节点不暴露管理方法客户端操作调用顶层节点的方法递归遍历整棵树调用顶层节点的interpret()递归计算出结果典型应用文件系统、组织架构、AWT 组件树四则运算、正则表达式、Spring SpEL4. JDK 源码深度对比4.1 AWT 组件树组合模式// AWT 中Panel 是容器Button 是叶子都继承自 Component// add() 方法在容器中管理子组件paint() 递归渲染整棵组件树PanelpanelnewPanel();ButtonbtnnewButton(点击);panel.add(btn);// 容器管理子组件panel.paint(graphics);// 递归渲染所有子组件为什么是组合模式Button和Panel都继承自Component接口统一Panel通过add()管理子组件Button没有子组件调用paint()时Panel递归调用所有子组件的paint()——行为一致。4.2 Java 正则表达式解释器模式// Pattern 内部将正则表达式编译为一棵语法树PatternpatternPattern.compile(a(b|c)*d);Matchermatcherpattern.matcher(abcd);booleanmatchesmatcher.matches();为什么是解释器模式正则表达式a(b|c)*d被解析为一棵语法树a、b、c、d是终结符字符字面量|和*是非终结符运算符匹配时递归遍历语法树每种节点字符、选择、重复执行不同的匹配逻辑——行为各不相同。5. 组合模式可以作为解释器模式的“基础结构”解释器模式通常建立在组合模式之上——语法树本身就是一种树形结构非终结符节点包含子表达式这与组合模式的容器-叶子结构高度相似。对比维度组合模式解释器模式关注点结构的组织方式结构的计算逻辑组合关系独立使用通常建立在组合模式之上面试常见问法“如何统一处理树形结构”“如何设计一个表达式解析器”一句话总结组合模式负责“搭架子”树形结构解释器模式负责“填逻辑”每种节点的计算规则。Spring SpEL 就是先构建组合树再递归求值的典型代表。6. 面试必问 追问连环炮基础必问组合模式和解释器模式都用到了树有什么区别 组合关注“结构统一”——叶子与容器行为一致客户端统一操作解释器关注“递归求值”——每种节点有不同的计算逻辑。什么时候用组合什么时候用解释器 需要统一处理树形结构文件系统、菜单→ 组合需要定义语法规则并求值表达式、规则引擎→ 解释器。面试官追问“解释器模式和组合模式能配合使用吗” 可以。解释器模式的语法树通常建立在组合模式之上——用组合模式管理树结构用解释器模式实现每个节点的求值逻辑。Spring SpEL 就是这样做的。“为什么复杂语法不推荐解释器模式” 因为每个语法规则都要对应一个类类数量会爆炸类膨胀问题递归求值性能远低于直接编译。此时应用 ANTLR、JavaCC 等专业解析器生成工具。“组合模式中如果只想遍历叶子节点怎么办” 在 Component 接口中定义isLeaf()方法或使用访问者模式对不同节点类型分别处理。恭喜如果你能立刻画出文件系统的树形结构和四则运算的语法树并说出“组合关注结构统一解释器关注递归求值”你已经掌握了这两棵树最核心的区别。延伸阅读本文是组合模式与解释器模式的深度对比。如果你想先了解每种模式的完整原理、UML、代码实现和面试题可以先阅读正篇——组合模式树形结构处理部分与整体一视同仁 和 解释器模式自己动手写一个小语言解释器再回来看这篇对比效果更佳。 《Java 23 种设计模式从踩坑到精通》快速导航开篇系列介绍与目录当前番外 · 组合 vs 解释器 —— 结构树 vs 计算树你在这里 延伸阅读组合模式正篇 解释器模式正篇创建型模式汇总结构型模式汇总行为型模式汇总 关注《Java 23 种设计模式从踩坑到精通》用 25 篇文章彻底吃透设计模式。福利预告全系列代码及 UML 源码将在完结时统一打包开放点击「关注」「收藏」第一时间获取。 除了设计模式我也在深挖智能物流实战WMS、托盘调度、机器学习落地。欢迎点击头像看看专栏 《出版社物流WMS智能调度实战》。技术相通思路可鉴。

相关新闻

量化交易中价格模式存在性的可证伪检验框架

量化交易中价格模式存在性的可证伪检验框架

1. 这个问题不是学术争论,而是每天真金白银在交易的现实“股票价格:可预测的模式,还是纯粹的随机?”——这句话听起来像金融学课堂上的思辨题,但如果你在早盘盯过K线、在收盘前改过三次止盈点、在财报发布前彻夜查过行…

2026/7/15 23:35:35阅读更多 →
诺可可网络搭建全国AI营销联盟 以AI旺旺武器库工具矩阵常态化赋能全国合作伙伴

诺可可网络搭建全国AI营销联盟 以AI旺旺武器库工具矩阵常态化赋能全国合作伙伴

近日,陕西诺可可网络科技有限公司依托商界西北研究院平台资源,正式发起全国AI营销联盟,面向全国数字服务从业者、广告服务商、中小企业运营团队开放合作体系,凭借自研全链路营销工具“AI旺旺武器库”矩阵常态化输出技术、方案、运…

2026/7/15 23:35:35阅读更多 →
ESP32-WROOM-32UE-N4R2选型解读:双核+大PSRAM,外置天线的“实力派”

ESP32-WROOM-32UE-N4R2选型解读:双核+大PSRAM,外置天线的“实力派”

做物联网开发的工程师应该对ESP32-WROOM系列不陌生,不少客户在选型时会特别关注型号里带“UE”和“R2”后缀的版本。今天就来聊聊ESP32-WROOM-32UE-N4R2这颗模组的真实定位和价值。核心规格:双核240MHz 4MB Flash 2MB PSRAM这颗模组基于ESP32系列芯片&…

2026/7/15 23:35:35阅读更多 →
告别网盘限速烦恼:LinkSwift直链下载助手完整使用指南

告别网盘限速烦恼:LinkSwift直链下载助手完整使用指南

告别网盘限速烦恼:LinkSwift直链下载助手完整使用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…

2026/7/16 0:30:45阅读更多 →
Proteus进阶:从8×8到16×16点阵屏的硬件设计与软件驱动全解析

Proteus进阶:从8×8到16×16点阵屏的硬件设计与软件驱动全解析

1. 点阵屏基础与硬件选型如果你玩过单片机开发,肯定对88点阵屏不陌生——那种能显示简单图案和字符的小方阵。但要用它显示完整汉字,就显得捉襟见肘了。一个1616的点阵屏才是汉字显示的"黄金尺寸",可惜Proteus元件库里并没有现成的…

2026/7/16 0:30:44阅读更多 →
深入UDS诊断:0x83服务如何精准调控通信时序参数

深入UDS诊断:0x83服务如何精准调控通信时序参数

1. 0x83服务基础概念与核心价值在汽车电子诊断领域,UDS协议中的0x83服务就像交通信号灯控制系统,它负责动态调节诊断通信的"红绿灯节奏"。想象一下早晚高峰时交警手动调整路口信号灯的场景——0x83服务就是诊断通信中的那位"智能交警&quo…

2026/7/16 0:30:44阅读更多 →
STM32与SX1262实战:从驱动移植到LoRaWAN节点开发

STM32与SX1262实战:从驱动移植到LoRaWAN节点开发

1. STM32与SX1262硬件选型指南在物联网节点开发中,硬件选型直接影响通信距离和功耗表现。STM32F4系列(如STM32F407)凭借168MHz主频和丰富外设成为中高端LoRa节点的首选,而STM32L0系列(如STM32L071)则因其超…

2026/7/16 0:30:44阅读更多 →
NAND FLASH ECC算法演进:从汉明码到BCH的硬件实现与选型指南

NAND FLASH ECC算法演进:从汉明码到BCH的硬件实现与选型指南

1. NAND Flash为什么需要ECC保护?第一次拿到NAND Flash芯片时,你可能觉得它就是个普通的存储设备。但实际使用中会发现,即使严格按照时序操作,读取的数据偶尔也会出错。这是因为NAND Flash的物理特性决定了它在存储数据时存在固有…

2026/7/16 0:30:42阅读更多 →
程序员必看:2026年AI大模型如何影响你的薪资?从12K到6万,关键技能大揭秘!

程序员必看:2026年AI大模型如何影响你的薪资?从12K到6万,关键技能大揭秘!

2026年程序员薪资出现严重分化,前端、后端岗位需求下降52%,但AI大模型岗位月薪可达40K。企业裁员的同时,也在加大AI投入,新发AI岗位量同比增长约12倍,平均月薪超6万元。传统软件开发技能贬值,而掌握AI工具、…

2026/7/16 0:25:40阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/15 6:42:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/15 6:12:45阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/15 10:54:00阅读更多 →
A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并

A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并

摘要:本文系统讲解如何利用Codex App的Review功能与GitHub PR工作流,实现从代码修改到安全合并的完整流程。涵盖Review面板深度使用、/review命令实战、GitHub Connector配置、PR描述撰写技巧,以及常见问题排查方法。通过多个实战案例和流程图,帮助开发者建立高效的AI辅助代…

2026/7/16 0:00:38阅读更多 →
遗传算法解5皇后问题:从Hello World到工业优化的进化实验室

遗传算法解5皇后问题:从Hello World到工业优化的进化实验室

1. 项目概述:为什么用遗传算法解5皇后问题,而不是直接回溯?我带过十几届算法课,也给不少初创团队做过AI架构咨询。每次讲到组合优化问题,学生和工程师的第一反应永远是“写个回溯试试”。这没错——55棋盘上找所有合法…

2026/7/16 0:00:38阅读更多 →
5.1V稳压管输出为何只有4.7V?工作电流与负载影响分析

5.1V稳压管输出为何只有4.7V?工作电流与负载影响分析

前几天调试一个简单的电源模块,用到了5.1V稳压管。电路接好,上电测试,万用表一量——输出居然只有4.7V。第一反应是稳压管坏了,换了一个新的,结果还是4.7V。这让我想起很多初学者都会遇到的困惑:明明标称5.…

2026/7/16 0:00:38阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/15 15:50:47阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/15 8:52:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/15 14:06:23阅读更多 →