news 2026/10/2 4:29:12

IAR多版本共存与老工程迁移:ARM/8051工具链选型及避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
IAR多版本共存与老工程迁移:ARM/8051工具链选型及避坑指南

做嵌入式这行时间长了,硬盘里总会躺着几个不同年份的 IAR 安装包。有的是给 Cortex-M 用的,有的是给 8051 用的,还有几年前为了维护一个老 ZigBee 项目专门留下来的。每次换电脑、带新人、或者接一个"祖传工程"的活儿,第一件事就是翻这些安装包。IAR 这个工具链的特点是:版本之间的兼容性没有想象中那么好,而很多芯片厂商的 SDK 又死死绑定某个特定版本。所以"收集历史版本"这件事,本质上不是囤积癖,而是一种工程上的风险对冲。这篇就聊聊 IAR 各条产品线的版本脉络、多版本怎么共存、老工程怎么迁移、以及那些只有踩过才知道的坑。刚入门的朋友可以把它当成选版本的参考,做维护和移植的朋友可以重点看第三、四、五章。

1. 把"版本集合"当成一个正经工程问题来对待

1.1 先分清 IAR 到底有几条产品线

很多人说"IAR 版本"的时候,脑子里想的其实只是 ARM 那条线,但 IAR Systems 的历史产品线远不止一条。简单列一下:面向 Arm Cortex-M/A/R 的IAR Embedded Workbench for Arm(常缩写 EWARM);面向 8051 内核的IAR Embedded Workbench for 8051(EW8051),TI 的 CC2530、CC2531 那一票 ZigBee 芯片就是靠它;面向 STM8 的EWSTM8;面向 AVR 的EWAVR;面向 MSP430 的EWMSP430;还有更小众的 Renesas RX、RL78,以及早期的 ARM7/ARM9 时代的 EWARM 老版本。

这几条线是独立的安装包、独立的版本号、独立的授权。你装了一个 EWARM 9.60,并不代表你能打开 8051 工程,反过来也一样。所以真正意义上的"版本集合",是"每条产品线各自维护一份可用版本清单",而不是笼统地留一堆安装程序了事。

我自己的习惯是按产品线建目录:Tools/IAR/ARM/、Tools/IAR/8051/、Tools/IAR/STM8/,每层下面再按大版本号分文件夹。这个结构看起来啰嗦,但等你三年后要找一个 8.10.3 的安装包时,会感谢当初的自己。

1.2 版本号断代:三个真正影响工程的关键节点

IAR 的小版本号更新非常频繁,但真正会让老工程"打开就报错"的断代节点其实只有几个,搞清楚这几个,比记住所有版本号有用得多。

第一个节点是7.x 到 8.x。8.x 引入了基于 Clang 技术的新一代编译器前端,C 语言标准支持从 C99 往前推了一大截,优化器也重写了。好处是代码质量明显提升,代价是一些依赖旧编译器"未定义行为"的代码会暴露出问题,比如变量没初始化就使用、依赖特定求值顺序的写法,8.x 下可能直接给你一个 warning 甚至行为改变。

第二个节点是8.x 到 9.x。9.x 除了编译器继续演进,IDE 本身、设备支持包的组织方式、以及安装目录结构都有调整。9.x 之后的工程文件里会写入版本标记,用 9.60 打开一个 8.50 的工程通常会触发一次"工程转换向导",转换完就回不去了——除非你有备份。

第三个节点是8051 线的 8.x 与 9.x/10.x。这条线看起来更新慢,但 TI 的 Z-Stack 各版本对 EW8051 的要求非常明确,选错一个大版本,编译能过但运行起来协议栈行为不对,这种问题最难查。

1.3 什么情况下必须往回找老版本

不是所有老工程都值得升级。我的判断标准很朴素:如果这个工程已经量产、没有新功能需求、只是偶尔改个参数,那就不动它,用老版本打开。升级工具链是有成本的——重新验证编译选项、重新跑回归测试、确认时序和内存占用没变化,这些工作量往往被严重低估。

反过来,遇到下面几种情况,就值得花时间往新版本迁:芯片厂商的新版 SDK 只支持新工具链;需要 C11/C++17 特性;需要用到新的调试能力(比如 SWO 高级 trace、新的静态分析工具);或者团队统一维护成本的考虑。

2. 主流版本横向对照与选型建议

2.1 Arm 线:8.x 和 9.x 到底差在哪

如果你现在要新做一个 Cortex-M 项目,直接上 9.x 的最新版就行,没必要纠结。真正需要对照的是维护老工程时该选哪个。

8.50.x 是我个人认为 8.x 系列里最稳定的收尾版本,很多国产芯片厂商的 SDK 到现在还明确写"推荐 IAR 8.50"。9.x 系列里,9.30、9.40、9.50 是出镜率比较高的几个。9.x 对 Cortex-M55、M85 这类新核的支持更完整,对 Armv8-M 的 TrustZone 支持也更成熟。

一个容易被忽略的差别是编译速度。同样一个中等规模工程,我在同一台机器上实测,9.50 的增量编译比 8.50 快一些,但首次全量编译因为设备支持包更大,反而慢一点。如果你的日常工作流是频繁增量编译,这个差别是能感受到的。

还有一点,9.x 开始 IDE 对高分辨率屏幕的支持好得多。8.x 在 4K 屏上那个界面,看久了眼睛是真的累。

版本段典型小版本编译器前端适合场景
7.x7.80.4自有前端维护 2015 年前的老工程
8.x8.40.2 / 8.50.9Clang 前端厂商 SDK 明确要求 8.x 的项目
9.x 前期9.10.2 / 9.20.4Clang 前端Cortex-M0/M3/M4 常规开发
9.x 后期9.50.x / 9.60.xClang 前端新项目、新内核、TrustZone

提示:表里的版本号是我手上用过的,具体小版本以官方发布记录为准。选版本时优先看芯片厂商 SDK 的 release notes,而不是看网上的"大家都在用哪个"。

2.2 8051 线:CC2530 与 ZigBee 老工程的版本依赖

8051 这条线在国内的存在感,很大一部分来自 CC2530。做 ZigBee 或者早期无线传感网的朋友,电脑里大概率有一个 EW8051。TI 的 Z-Stack 各版本对工具链的要求在官方 Release Notes 里写得很清楚,通常是 8.10.x 到 9.10.x 这个区间。

8051 编译器有个特性需要特别注意:它的大量扩展关键字直接和存储空间绑定,__data、__idata、__xdata、__pdata、__code各自对应不同的物理地址空间和访问指令。这意味着代码在不同版本间迁移时,存储模型的选择会直接影响生成的指令效率和栈使用。我记得有次把一个小工程从 8.x 换到 10.x,代码没动,编译出来的 code size 少了大概 6%,但 xdata 占用略有上升,原因是新版本对变量分配策略做了调整。这种变化不致命,但如果你在抠最后几百字节的 flash,就得留意。

另外 8051 线的 IDE 和 Arm 线是两套界面,快捷键、菜单结构都不太一样。常年做 Arm 的人第一次打开 EW8051 会有点不适应,别怀疑是自己记错了。

2.3 STM8、AVR、MSP430 这几条小众线

STM8 线主流就停在 3.x,3.10 和 3.11 用得最多。STM8 的工程一般不大,工具链也没必要追新。

AVR 线的 7.x 是最后的活跃版本,AVR 用户现在很多已经转到其他开源工具链了。

MSP430 线在国内还有一批做低功耗产品的用户,6.x 和 7.x 都能见到。

这几条线的共同建议是:一次装好,备份安装包,别指望以后还能轻松下载到。老版本安装包的下架速度比想象中快,官方历史版本页面通常只保留有限几个。我现在的做法是,只要一个版本在我的项目里跑通过,就把安装包连同当时的授权信息、工程模板一起归档到一个专门的移动硬盘里,标注清楚版本号和验证过的芯片型号。

3. 下载、安装与目录结构:多版本共存的底子

3.1 官方获取渠道与安装包命名规律

安装包只从官方渠道拿,这一点没有商量余地。非官方来源的安装包被改过什么,你根本无从判断,而这类工具链会直接接触你的源码和编译产物。

安装包的命名是有规律的,看懂命名能省很多事。以 Arm 线为例,文件名通常是EWARM-CD-<版本数字串>-<构建号>.exe这种形式,比如EWARM-CD-8509-xxxxx.exe对应 8.50.9,EWARM-CD-9502-xxxxx.exe对应 9.50.2。8051 线类似,前缀变成EW8051-。看到版本数字串,基本就能判断这是哪个小版本。

下载页面上一般同时提供"完整安装包"和"在线安装器"两种。强烈建议下完整安装包。在线安装器会一边下一边装,装到一半网络抖一下,留下一个半残的安装目录,清理起来很烦。而且完整安装包可以留着以后离线重装,这在公司网络受限的环境里价值很大。

3.2 安装路径规划与多版本共存的正确姿势

IAR 默认会把不同大版本装到不同目录,这一点做得比某些工具友好。但它默认路径里通常带空格和括号,比如C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.50。空格在某些老式构建脚本、Makefile 或者第三方 CI 环境里会引发引号转义问题。

我的做法是统一装到D:\IAR\EWARM\8.50.9、D:\IAR\EWARM\9.50.2这种无空格、层次清晰的路径下。安装时手动改路径即可,不需要额外配置。

多版本共存的关键是不要让多个版本共用配置文件目录。IAR 会把用户级的设置、最近工程列表、调试器配置存在用户目录下,同一大版本的不同小版本一般能分离,但跨大版本混用时会互相覆盖。如果你发现"我明明改了优化等级,下次打开又变回去了",八成是这个原因。

具体做法是分开启动:不要用开始菜单里那个指向模糊的快捷方式,而是直接进各自的安装目录,找common\bin\IarIdePm.exe手动启动,然后给每个版本单独建桌面快捷方式并重命名,比如"EWARM 8.50.9"、"EWARM 9.50.2"。看起来笨,但绝不会点错。

3.3 授权机制与 LMS001 报错的正确处理

IAR 的授权分几类:单机授权(绑定具体机器的硬件标识)、网络浮动授权(由授权服务统一分发)、以及官方提供的评估版本。评估版有时间和功能上的限制,适合学习和短期验证,但不要指望它支撑正式产品开发。

授权管理通过IAR License Manager完成,它通常随主程序一起安装。授权激活支持在线和离线两种方式,离线激活会生成一个请求文件,拿这个文件走一遍官方流程再拿回授权文件导入即可。企业环境里如果走浮动授权,客户端需要能访问到授权服务所在的主机和端口,防火墙策略要提前确认。

那个在搜索词里出现频率极高的Fatal Error[LMS001]: License check failed. Use the IAR License Manager to resolve the problem.报错,我处理过很多次,原因基本就这几类:

现象常见原因处理方向
打开 IDE 就报 LMS001授权未导入或已过期打开 License Manager 查看状态,重新激活
昨天还好,今天突然报系统时间被改过校正系统时间后重新校验
换主板后报错硬件标识变化重新走一次激活流程
浮动授权客户端报错网络不通或服务未启动检查服务主机连通性与端口
装了两个版本只有一个能开授权与版本不匹配确认授权覆盖的版本范围

注意:授权相关的操作一律走官方渠道。别去折腾来路不明的授权文件,一来不合规,二来这类文件往往捆绑了说不清的东西,得不偿失。

3.4 Add-on 和 plugins 到底干什么用的

安装完成后,你会发现菜单里有个 Add-ons 或者类似入口。这个东西的作用是扩展设备支持。IAR 主安装包覆盖的是主流大厂芯片,但一些国产芯片厂商(比如做 GD32 的)会提供自己的 Add-on 包,装进去之后新建工程时才能在器件列表里选到对应型号。

国产芯片的 Add-on 一般从芯片厂商官网的"工具与软件"页面下载,安装时它会自动找到你机器上的 IAR 安装路径。如果它找不到,说明版本组合不在它支持列表里,这时候要么换 IAR 版本,要么手工指定路径。

还有一类是Plugins,主要给调试器和第三方工具集成用,比如某些仿真器厂家提供的插件、或者和静态分析工具联动的组件。普通开发用不到,但如果你的调试器在 IAR 里识别不出来,去对应厂家找插件通常是解决路径。

4. 老工程在新版本里打开:迁移与报错排查

4.1 工程文件结构:先看懂再动手

IAR 的工程由几个文件组成,认识它们能让你在出问题时快速定位。.eww是工作区(workspace),一个工作区可以包含多个工程;.ewp是工程文件,本质是 XML,里面记录了器件型号、编译选项、包含路径、宏定义、优化等级这些;.ewd存放调试器设置;.ewt是静态分析工具的配置;.dep是依赖文件,可以删;.icf是链接器配置文件,管内存布局。

迁移之前,先复制一份整个工程目录做备份,这一步不能省。IAR 打开旧工程时会问是否转换,转换过程会直接改写.ewp和.ewd,而且通常不留旧版本备份。我有一次手快点确认,改完发现跑不通,想退回只能重新从版本库里拉。

.ewp里的版本标记在<state>节点附近。用文本编辑器打开能看到类似<version>8</version>这样的字段。新版本打开旧文件时,就是靠这个判断要不要触发转换。

4.2 编译选项、链接脚本和启动文件的变化

迁移最容易出问题的三个地方,我按出现频率排一下。

包含路径与宏定义。9.x 的工程选项面板调整了布局,有些选项从"编译器"挪到了"构建动作"里。转换后偶尔会出现路径丢失,表现是一堆cannot open source file或者identifier undefined。对照旧工程的.ewp文本,把CCIncludePath2、CCDefines这两个节点里的内容逐条核对一遍,是最快的办法。

链接脚本 ICF。.icf用的是 IAR 自己的描述语法,管着 ROM/RAM 的起止地址、栈堆大小、各个段的摆放。举例来说,定义栈大小是这样:

define symbol __ICFEDIT_size_cstack__ = 0x800; define symbol __ICFEDIT_size_heap__ = 0x400; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; place in RAM_region { block CSTACK, block HEAP, section .noinit };

如果换版本后出现placement failed或者region overflow,八成是新版本对某些段的默认对齐要求变了,或者设备支持包里的内存区域定义和旧版不同。这时候不要急着改大小,先打开 map 文件看看到底是哪一段超了。

启动文件。这是最典型的坑。IAR 的汇编启动文件和 MDK 的完全是两套语法。IAR 用SECTION、PUBWEAK、THUMB、REORDER这些伪指令,MDK 用AREA、EXPORT、PROC。从别的工具链搬过来的工程,启动文件必须换成 IAR 版本,不能直接塞。

顺带说一个具体的语法差异,正好对应到搜索词里出现过的那句:

uint8_t ucheap[1024] __section(".heap") = {0};

IAR 用__section(".heap")把变量放到指定段,老版本还可以写成@ ".heap";而 GCC 系工具链写的是__attribute__((section(".heap")))。搬代码的时候这行不改,编译直接报错。类似的关键字还有__root(强制保留符号,中断向量表常用)、__weak、__packed、__no_init,这些在 IAR 里都是原生关键字,不需要加下划线前缀以外的花招。

4.3 常见报错速查表

报错关键词可能原因排查方向
cannot open source file包含路径丢失核对.ewp里的 include 节点
identifier "xxx" is undefined宏定义丢失或头文件顺序变了检查 Defines 与头文件包含顺序
placement failed/region overflowICF 段布局与新设备包不符看 map 文件定位超限段
undefined external库版本不匹配或未加入库文件检查 Library 配置
the generation feature is not of version 18工程/授权特性版本不匹配确认授权覆盖范围与工程转换状态
下载时Failed to load flash loader器件选错或 board file 路径失效重新选择器件,检查 flashloader 目录
调试时变量显示乱码优化等级过高或调试信息格式变化调低优化等级对比验证

上面那个the generation feature is not of version 18的提示,通常在工程的授权特性开关和当前授权不匹配时冒出来。处理思路是先确认工程属性里勾选的特性(比如某些高级分析功能)是不是超出了你持有的授权范围,把多余的勾去掉,或者升级到覆盖该特性的授权。

5. 动手实操:新建工程、烧录与系统移植

5.1 从零建一个 STM32F103C8T6 工程

拿最常见的 STM32F103C8T6 举例,把整个流程走一遍。

打开 IDE,菜单里选新建工程,弹出器件选择框。注意这里有个容易迷惑的点:器件是按"厂商 + 系列 + 具体型号"三级缩进的,选错一级后面都会连锁出错。选到STMicroelectronics / STM32F1 / STM32F103C8,确认。

工程建好之后,先别急着写代码,把三件事配好。

第一件是器件宏定义。在编译器选项的预定义宏里,加上STM32F103xB(具体宏名要和你的标准外设库或 HAL 库对得上)。这个宏决定了头文件里哪些寄存器定义会被展开,加错了编译能过但寄存器地址不对,跑起来就是玄学问题。

第二件是包含路径。把库目录、CMSIS 目录、用户代码目录都加进去。路径建议用相对路径,相对于工程文件所在目录,这样工程整个拷给别人也能用。

第三件是链接配置。如果是芯片自带 flash 启动,用默认的 ICF 一般够用;如果你要预留 bootloader 区,就得自己改 ICF,把 ROM 起始地址往后挪。这一步改错了最典型的表现就是程序烧进去不跑——因为向量表的位置和实际启动地址对不上。

启动文件用 IAR 版本的startup_stm32f103xb.s,这个文件在标准外设库的 IAR 目录下有现成的。里面定义了向量表、复位入口、默认的中断服务函数(都是死循环,方便定位未处理中断)。如果你用的是自己写的启动文件,记得向量表要放在段的最前面,并且用__root或者相应的段属性保证它不被优化掉。

5.2 烧录配置:几个必须确认的点

烧录配置在工程选项的调试器页面。选驱动(J-Link、ST-Link、CMSIS-DAP 各自对应),然后进下载页面。

必须勾选"使用 flash loader",否则下载会直接写内存,断电就没了。IAR 自带一大批.board文件,放在安装目录的config\flashloader下面,按芯片系列分目录。如果下载时报找不到 flash loader,先确认器件型号选对了,再去看这个目录里有没有对应的 board 文件。

另一个常被忽略的选项是校验下载。勾上之后,写完 flash 会回读比对,多花一两秒,但能避免"显示下载成功、实际数据是坏的"这种最恶心的情况。我吃过一次亏,一个电源波动导致写入部分失败,IDE 照样报成功,排查了半个下午。

调试连接方式上,SWD 比 JTAG 省引脚,速度也够用,现在基本都用 SWD。如果连接不稳定,先降速试试,把时钟从 4MHz 降到 1MHz,很多时候问题就消失了——尤其是飞线连接或者板子布线不理想的情况。

5.3 FreeRTOS 与 RT-Thread 的移植要点

在 IAR 下移植实时操作系统,核心工作是把与编译器相关的那几个文件替换成 IAR 版本。

FreeRTOS 的portable目录下按编译器分了子目录,找IAR/ARM_CM3(Cortex-M3/M4 用这个)或者IAR/ARM_CM0。这些目录里的port.c和portmacro.h里用的是 IAR 的内联汇编语法,比如临界区用的关中断指令,MDK 和 IAR 的写法不一样,直接混用会编译报错。三个异常处理函数需要在启动文件的向量表里对号入座:SVC_Handler对应vPortSVCHandler,PendSV_Handler对应xPortPendSVHandler,SysTick_Handler对应xPortSysTickHandler。名字对不上的表现是任务能创建但调度不起来,卡在第一个任务里不动。

RT-Thread 类似,在libcpu/arm/cortex-m3(或对应内核目录)下有context_iar.S,这个就是给 IAR 用的上下文切换汇编。启动文件也用 IAR 版本。配置阶段用rtconfig.h控制功能开关,注意在 IAR 的工程选项里把需要用到的宏也同步加进去,因为 IAR 的工程不会自动读rtconfig.h里的所有开关——有些是预处理器层面的,有些需要构建系统参与。

移植完成后第一件事是量栈。IAR 可以生成静态栈深度分析报告(在链接器选项里开启),它会给出最坏情况下的调用栈深度。把这个数字和你在 ICF 里定义的 CSTACK 大小对比,留出至少 30% 余量。系统跑起来之后再配合运行时栈检测(往栈里填魔数然后定期扫描),双保险。

6. 版本归档与团队协作的经验

6.1 归档策略:怎么存才不白存

我自己摸索出来的一套归档规范,用了几年觉得挺省心。

每个版本一个文件夹,命名格式是"产品线-版本号-验证状态",比如EWARM-8.50.9-已验证-STM32F4。文件夹里放:完整安装包、安装时用的授权信息说明(不存授权文件本身,只记录类型和获取方式)、一个最小工程模板、一份简短的验证记录(编译什么芯片、跑通什么功能、遇到过什么坑)。

验证记录这一条特别重要。很多时候你只是"装过",但没真正在项目里用过,等到急着用的时候才发现某个功能有问题。有一份记录,你就知道这个版本到底能不能靠得住。

另外建议把 ICF 模板和启动文件也一起归档。这些东西在维护老工程时反复要用,每次现找很烦。

6.2 团队里怎么约定版本

团队协作最大的问题不是技术,是版本不一致。同一个工程,你这边编译出来 26KB,同事那边 28KB,查半天发现是 IAR 版本不同。

我的建议是双管齐下。工程根目录放一个TOOLCHAIN.md之类的说明文件,写清楚推荐版本、最低版本、已验证版本。同时在工程文件里,把版本标记也提交进版本库,这样谁改了工具链版本,diff 里一眼能看出来。

CI 环境里尽量固定版本,用完整安装包加静默安装参数部署,不要用在线安装。构建镜像做好之后打个 tag,改工具链版本就走一次完整的回归测试。

还有个小技巧:在编译产物里嵌入版本信息。用预处理宏把 IAR 的版本号拼进字符串常量,放到某个固定的数据段里,出问题时用调试器一读就知道这个固件是用哪个版本编的。这个信息在生产现场排查问题时特别有用,因为固件传到后面,谁都不记得当初用的什么工具链。

最后分享一个我自己的习惯:每次成功用某个 IAR 版本搞定一个棘手工程,就花五分钟在归档目录里写两句话,记下当时解决了什么问题。几年下来,这份记录比任何搜索引擎都好使——因为它是针对你自己踩过的坑写的。工具链这东西,版本会一直变,但排查问题的思路是通用的,攒下来的经验才是真正属于自己的东西。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 4:28:48

Spring Boot游泳馆管理系统毕业设计:从选题到答辩全流程指南

最近不少准备做毕业设计的同学来问我选题的事&#xff0c;软件工程、计算机科学与技术专业里&#xff0c;基于Spring Boot的管理系统几乎是每年雷打不动的热门方向。在这么多题目里&#xff0c;游泳馆管理系统属于挺有代表性的一个&#xff1a;业务场景不复杂&#xff0c;但覆盖…

作者头像 李华
网站建设 2026/10/2 4:28:18

基于Simscape Multibody的四旋翼建模与PID控制仿真

从零开始搭一架能飞的四旋翼&#xff0c;我选择Simscape Multibody来做可视化仿真。本文基于MATLAB/Simulink与Simscape工具链&#xff0c;完整梳理四旋翼无人机的建模思路、动力学参数设置、闭环控制器搭建和三维可视化调试流程&#xff0c;包含坐标系约定、推力/力矩计算、PI…

作者头像 李华
网站建设 2026/10/2 4:27:56

苍穹外卖实战第一天:环境搭建、启动排坑与登录链路解析

学了八个多月 Java&#xff0c;SSM、Spring Boot 这些框架跟着视频敲了个遍&#xff0c;但说实话&#xff0c;每次别人问我“你做过什么项目”&#xff0c;我都底气不足。大学里的课设是个图书管理系统&#xff0c;代码量摆在那&#xff0c;自己都嫌薄。纠结了一阵子之后&#…

作者头像 李华
网站建设 2026/10/2 4:27:32

Meta Muse登顶App Store:AI智能体工作流搭建与实操指南

1. 从 App Store 登顶说起&#xff1a;Meta Muse 到底是个什么东西Meta Muse 这个名字最近在圈子里刷屏的频率有点高。我最早注意到它&#xff0c;是因为 App Store 免费榜榜首的位置被一个叫“Meta Muse”的应用占了——不是那种昙花一现的买量产品&#xff0c;而是连续好几天…

作者头像 李华
网站建设 2026/10/2 4:27:32

Java模板方法模式:天条戒律铸造流程骨架

老朋友们都知道我这个《Java 设计模式西游篇》系列的规矩——每一回挑一个设计模式&#xff0c;借取经路上的故事把理论盘活。前九回我们已经聊了工厂、单例、策略、观察者这些常用模式&#xff0c;这一回轮到第十回&#xff1a;模板方法模式&#xff0c;题目就叫《模板方法定规…

作者头像 李华