第39章:设计模式:带走的架构智慧¶
生活类比:武术心法
学会一套拳,不如看懂它背后的发力原理。读源码也一样,看完几万行实现之后,真正能带走的,是那些能迁移到别的项目里的通用模式。
这一章先回答一个问题
如果把 Claude Code 所有具体业务都拿掉,只保留“值得抄走的工程思想”,最重要的会是哪几条?
这章不再追某个单文件,而是提炼横跨全书的几种模式:统一协议、分层治理、显式入口、条件装配、后台化运行与可恢复执行。
39.1 策略 + 工厂:先统一接口,再让能力自由增长¶
Claude Code 最鲜明的一条主线,就是工具系统。Tool.ts 先定义共同协议,buildTool() 再用工厂式方式统一装配,tools.ts 则把不同来源的工具拼成同一池子。
flowchart LR
A["Tool 接口"] --> B["buildTool()"]
B --> C["内置工具"]
B --> D["MCP 工具"]
B --> E["技能/团队工具"]
C --> F["统一工具池"]
D --> F
E --> F
这套设计最值得学的地方是:先把入口统一,再允许行为多样。这样新增能力时,不必反复发明一套新框架。
39.2 装饰器 + 中间件:横切关注点不要长进业务里¶
权限检查、Hook、日志、分类器、沙箱这些能力,都不是某个工具的“核心业务”,却又必须发生在执行路径上。Claude Code 的处理方式非常成熟:让这些横切关注点作为包装层和中间件链存在。
flowchart TD
A["原始工具执行"] --> B["权限包装"]
B --> C["Hook 链"]
C --> D["分类器/追踪"]
D --> E["沙箱执行"]
style B fill:#e3f2fd,stroke:#1e88e5,color:#000
style C fill:#ede7f6,stroke:#7e57c2,color:#000
这让工具本身可以聚焦“做什么”,而不必背着一堆与业务无关的治理逻辑。
39.3 状态机 + 可恢复执行:让 Agent 不只是“会循环”¶
query.ts 和 QueryEngine.ts 里最珍贵的,不是有个 while (true),而是:
- 有明确状态
- 有退出条件
- 有错误恢复
- 有压缩边界
- 有继续执行的入口
flowchart TD
A["输入"] --> B["状态推进"]
B --> C["模型调用"]
C --> D["工具执行"]
D --> E["更新状态"]
E --> F{"继续 / 停止 / 恢复"}
F -->|继续| B
F -->|恢复| G["compact / retry / reload"]
真正好的 Agent 系统,不是“能跑起来”,而是“中断之后还能接着跑”。
39.4 条件装配:功能很多,但默认体验不能失控¶
Claude Code 的大量 feature()、GrowthBook 和动态加载,说明它大量使用了条件装配模式:
- 某些能力只在特定构建进入
- 某些能力只在特定用户/组织启用
- 某些命令和工具只在当前上下文暴露
flowchart LR
A["候选能力"] --> B["编译期 gate"]
B --> C["运行期 gate"]
C --> D["最终装配进当前会话"]
这比“所有能力永远全部打开”更克制,也更适合长期演化。
39.5 平台模式:Claude Code 不是只想做产品¶
MCP、技能、插件、命令系统这些组合在一起,说明 Claude Code 不是只想做一个“内置功能足够多的 CLI”,而是正在长成一个平台。
mindmap
root((Claude Code 的平台化特征))
工具接口统一
MCP 协议接入
技能文档驱动
插件生命周期
命令空间扩展
Bridge 多宿主
这类架构最难得的不是某个功能多强,而是它开始具备“承载别人能力”的能力。
39.6 本章心法:六条值得带走的工程原则¶
- 先统一接口,再扩展能力。
- 让横切关注点离开业务核心。
- Agent 必须是状态机,而不是一次性函数。
- 可恢复性和可继续性比“首次执行很聪明”更重要。
- 平台能力必须回到同一治理框架中。
- 大系统不要害怕门控,要害怕无门控扩张。
🔭 深水区(架构师选读)
Claude Code 真正迷人的地方,不是它用了某个时髦 AI 技术,而是它把大量经典软件工程思想重新放进 Agent 场景里:统一协议、横切治理、状态机、平台化、条件装配、可恢复执行。这些思想不会随模型迭代过时。
本章小结
如果只带走一句话,那就是:Claude Code 的优秀并不神秘,它把传统软件工程里的好模式,用一种非常现代的方式重新组合进了 Agent 产品。
关键源码索引
- 工具协议:
Tool.ts - 工具池装配:
tools.ts - Agent 主循环:
query.ts - 会话引擎:
QueryEngine.ts - 命令系统:
commands.ts - Bridge 分层:
bridgeMain.ts
逆向提醒
设计模式是本书的分析视角,不是官方术语。它们的价值在于帮助你迁移工程思想,而不是要求你逐字对应每个 GoF 名称。