{"name":"行为模式","id":"软件工程-设计模式-行为模式","content":"# 行为模式\n\n## 一、行为模式的第一性原理\n\n### 1. 什么是“行为”？\n\n在软件系统中，**行为 = 在特定上下文中，对请求或事件做出的响应方式**。\n\n行为设计的核心矛盾并不在于“怎么写代码”，而在于以下问题：\n\n* 行为**由谁决定**？\n* 行为**如何变化**？\n* 行为**如何传播**？\n* 行为**是否需要被记录、撤销、组合**？\n* 行为是否**依赖稳定的数据结构或状态结构**？\n\n**行为模式，本质上是对这些问题的不同回答。**\n\n---\n\n## 二、行为模式的本质问题空间（总览模型）\n\n从第一性原理出发，GOF 行为模式可以归入 5 类稳定问题空间：\n\n### 2.1 行为由谁决定？（Decision Ownership）\n\n* **对象自身决定**：状态模式\n* **外部注入决定**：策略模式\n\n> 核心矛盾：\n> 行为切换的**控制权**是在对象内部，还是在对象外部？\n\n---\n\n### 2.2 行为如何传播？（Behavior Propagation）\n\n* **线性传播**：责任链\n* **中心协调**：中介者\n* **广播传播**：观察者\n\n> 核心矛盾：\n> 请求或事件是**逐级传递、集中调度，还是去中心广播**？\n\n---\n\n### 2.3 行为是否需要对象化？（Behavior as Object）\n\n* **是**：命令\n* **否，结构固化**：模板方法\n\n> 核心矛盾：\n> 行为是否需要被**记录、排队、撤销、组合、持久化**？\n\n---\n\n### 2.4 行为是否依赖稳定结构？（Structural Stability Assumption）\n\n* **强依赖结构稳定**：访问者、解释器\n* **弱依赖或无依赖**：其他大多数模式\n\n> 核心矛盾：\n> 是“数据结构稳定，操作常变”，还是“结构与行为一起变化”？\n\n---\n\n### 2.5 行为如何被遍历？（Traversal Control）\n\n* **由客户控制**：外部迭代器\n* **由容器控制**：内部迭代器\n\n> 核心矛盾：\n> 遍历控制权在**使用者**还是**数据结构本身**？\n\n---\n\n## 三、模式级重构（从“定义”到“设计哲学”）\n\n以下不再重复教科书式定义，而统一采用：\n\n* 本质问题\n* 设计哲学\n* 引入的代价\n* 稳定前提\n* 工程判断信号\n\n---\n\n## 四、行为切换类模式\n\n### 4.1 状态模式（State）\n\n**本质问题**：\n\n> 行为随**内部状态**变化而变化，避免条件分支爆炸。\n\n**设计哲学**：\n\n* 将“状态 × 行为”的组合关系，拆解为独立状态对象\n* 行为切换权在对象**内部**\n\n**引入的代价**：\n\n* 状态类数量膨胀\n* 状态迁移关系复杂\n\n**稳定前提**：\n\n* 状态集合相对稳定\n\n**工程判断信号**：\n\n* 出现大量 `if/else` 或 `switch(state)`\n* 行为与状态强绑定\n\n---\n\n### 4.2 策略模式（Strategy）\n\n**本质问题**：\n\n> 在不修改上下文的前提下，替换不同算法或行为。\n\n**设计哲学**：\n\n* 行为是可插拔的\n* 行为选择权在**客户端或装配阶段**\n\n**引入的代价**：\n\n* 客户端必须理解策略差异\n* 参数传递可能膨胀\n\n**稳定前提**：\n\n* 策略可独立演化\n\n**工程判断信号**：\n\n* 多套算法，切换规则清晰\n* 不希望上下文感知状态变化\n\n---\n\n## 五、行为传播类模式\n\n### 5.1 责任链（Chain of Responsibility）\n\n**本质问题**：\n\n> 请求的处理者不确定，需要在多个处理者之间动态传递责任。\n\n**设计哲学**：\n\n* 解耦请求发送者与具体处理者\n* 责任是“**可转移的**”\n\n**关键特性**：\n\n* 不保证请求一定被处理\n\n**引入的代价**：\n\n* 调试困难\n* 链路过长导致性能与可观测性问题\n\n**工程判断信号**：\n\n* 多级校验 / 过滤 / 拦截\n\n---\n\n### 5.2 中介者（Mediator）\n\n**本质问题**：\n\n> 多对象交互形成网状依赖，导致系统失控。\n\n**设计哲学**：\n\n* 用中心协调者替代对象之间的多对多通信\n\n**引入的代价**：\n\n* 中介者可能演化为“上帝对象”\n\n**工程判断信号**：\n\n* 对象之间调用关系混乱\n* 修改一个对象影响多个对象\n\n---\n\n### 5.3 观察者（Observer）\n\n**本质问题**：\n\n> 状态变化需要通知多个依赖方。\n\n**设计哲学**：\n\n* 广播而非点对点调用\n* 目标与观察者解耦\n\n**引入的代价**：\n\n* 通知顺序不可控\n* 可能引发级联更新\n\n**工程判断信号**：\n\n* 事件驱动\n* UI / 领域事件\n\n---\n\n## 六、行为对象化与结构化模式\n\n### 6.1 命令（Command）\n\n**本质问题**：\n\n> 将“请求”本身作为一等对象对待。\n\n**设计哲学**：\n\n* 行为对象化\n* 支持撤销、排队、组合\n\n**引入的代价**：\n\n* 类数量增加\n\n**工程判断信号**：\n\n* 需要操作历史、事务、审计\n\n---\n\n### 6.2 模板方法（Template Method）\n\n**本质问题**：\n\n> 算法结构稳定，局部步骤易变。\n\n**设计哲学**：\n\n* 用继承固化流程骨架\n\n**引入的代价**：\n\n* 扩展依赖继承层级\n\n**工程判断信号**：\n\n* 流程固定、步骤可替换\n\n---\n\n## 七、结构稳定性假设类模式\n\n### 7.1 访问者（Visitor）\n\n**本质问题**：\n\n> 在不修改数据结构的前提下，增加新行为。\n\n**设计哲学**：\n\n* 数据结构稳定，操作多变\n\n**引入的代价**：\n\n* 新增 Element 成本极高\n\n**工程判断信号**：\n\n* 编译器、AST、报表系统\n\n---\n\n### 7.2 解释器（Interpreter）\n\n**本质问题**：\n\n> 用对象结构表示语法规则并执行。\n\n**设计哲学**：\n\n* 文法即模型\n\n**工程判断信号**：\n\n* DSL、小型规则引擎\n\n---\n\n## 八、遍历控制类模式\n\n### 8.1 迭代器（Iterator）\n\n**本质问题**：\n\n> 在不暴露内部结构的情况下遍历集合。\n\n**设计哲学**：\n\n* 遍历与结构解耦\n\n---\n\n## 九、模式对比速查矩阵\n\n| 维度    | 状态   | 策略  | 命令  | 责任链 |\n| ----- | ---- | --- | --- | --- |\n| 行为决定者 | 对象自身 | 客户端 | 调用者 | 链路  |\n| 是否可撤销 | 否    | 否   | 是   | 否   |\n| 行为对象化 | 否    | 否   | 是   | 否   |\n| 状态关联性 | 强    | 无   | 无   | 弱   |\n\n---\n\n## 十、现代架构中的行为模式映射\n\n* 观察者 → 事件总线 / MQ\n* 命令 → CQRS / 消息\n* 中介者 → Saga / Orchestrator\n* 状态 → 显式状态机\n* 责任链 → Pipeline / Filter Chain\n\n---\n\n## 十一、结语：行为模式的真正价值\n\n> 行为模式不是为了“多用设计模式”，\n> 而是为了**用更低的认知成本，管理系统行为复杂性**。\n\n使用行为模式前先问：\n\n* 我的行为复杂性来自哪里？\n* 谁在决定行为？\n* 行为是否需要被记录、传播、演化？\n\n## 关联内容（自动生成）\n\n- [/软件工程/设计模式/设计模式.md](/软件工程/设计模式/设计模式.md) 介绍了设计模式的基本概念、关键属性和演化规律，是理解行为模式的基础\n- [/软件工程/设计模式/结构型模式.md](/软件工程/设计模式/结构型模式.md) 与行为模式共同构成设计模式体系，结构型模式关注类和对象的组合，与行为模式的对象职责分配形成互补\n- [/软件工程/设计模式/创建型模式.md](/软件工程/设计模式/创建型模式.md) 与行为模式同属GOF设计模式体系，创建型模式关注对象创建，行为模式关注对象职责分配，两者共同构成完整的模式体系\n- [/编程语言/JAVA/高级/Servlet.md](/编程语言/JAVA/高级/Servlet.md) Servlet规范体现了多个经典的设计模式，包括行为模式中的模板方法模式、观察者模式和责任链模式等\n- [/编程语言/编程范式/函数式编程.md](/编程语言/编程范式/函数式编程.md) 函数式编程中的高阶函数、函数作为参数等概念与行为模式中的策略模式、模板方法模式等有对应关系\n- [/软件工程/架构/系统设计/可观测性.md](/软件工程/架构/系统设计/可观测性.md) 系统可观测性中的事件监控、日志记录等机制与行为模式中的观察者模式、命令模式等有密切关系\n- [/计算机网络/网络安全/安全架构.md](/计算机网络/网络安全/安全架构.md) 安全架构中应用了多种设计模式，包括策略模式用于动态配置访问策略，观察者模式用于监控安全事件\n- [/数据技术/流处理.md](/数据技术/流处理.md) 流处理系统中的处理模式与行为模式中的责任链、观察者等模式在事件处理和传播方面有相似之处\n- [/软件工程/微服务/服务治理/服务容错.md](/软件工程/微服务/服务治理/服务容错.md) 服务容错设计中包含多种设计模式，与行为模式中的策略、命令等模式在处理分布式系统行为方面有共通点\n","metadata":"tags: ['设计模式', '软件工程', '架构设计', '思维方法论']","hasMoreCommit":true,"totalCommits":20,"commitList":[{"date":"2026-03-02T10:15:03+08:00","author":"MY","message":"docs(SUMMARY): 更新文档目录结构并调整章节组织","hash":"291401ad85fb2dca108efed36ead29f7bbfe5ed8"},{"date":"2026-02-12T14:07:03+08:00","author":"MY","message":"doc: 整理标签","hash":"290b3e8ad18f48832ac282290238d020fc030a88"},{"date":"2026-01-14T17:46:17+08:00","author":"MY","message":"docs(SUMMARY): 移除重复的AJAX文档引用","hash":"61a6fa3a3c2b1fee57724aefa49bc5512b017e5c"},{"date":"2026-01-07T11:32:59+08:00","author":"MY","message":"docs(behavioral-patterns): 重构行为模式文档结构并添加第一性原理分析","hash":"f945f99c315cd1d7680f46a474566b1fce76205d"},{"date":"2024-11-15T15:13:06+08:00","author":"MY","message":"📦软件设计","hash":"72559316d91a8efb68055aa4f2a0af774fc2d724"},{"date":"2024-09-04T16:26:13+08:00","author":"MY","message":"✏设计模式","hash":"33156abf2baa864513af55ce7fabc08cd84e7fac"},{"date":"2024-09-03T20:07:11+08:00","author":"MY","message":"✏设计模式","hash":"3d86449a875acd8fc0644eb1edcf0fe13c648f50"},{"date":"2023-11-07T20:03:10+08:00","author":"MY","message":"✏行为模式","hash":"549b593100810faf968036bdef1bc93600ad46c6"},{"date":"2023-03-09T02:59:03Z","author":"My","message":"✏设计模式","hash":"59189b4c38ed20fc71e63bf7a64d14f88a943543"},{"date":"2021-06-15T16:27:53+08:00","author":"cjiping","message":"✏更新 访问者模式","hash":"3e1a278f24d67855c32ddd40fec758a7465716f3"}],"createTime":"2019-11-25T09:27:14+08:00"}