15|责任链:让请求按明确规则经过处理节点
文章发布需要检查标题和权限。最初把它们写进一个方法很简单,但不同入口逐渐需要不同校验组合,且失败提示取决于先检查哪一项。继续复制 if 会让规则顺序分散。
17|解释器:用对象树表达一门小语言
文章筛选规则需要表达“带 java 标签,并且带 oop 或 gradle 标签”。散落在页面里的布尔表达式无法作为配置组合、复用或逐节点检查。我们可以把规则的语法结构直接建成对象树。
18|迭代器:把遍历状态从集合中取出来
阅读列表需要顺序展示文章。若集合自身保存一个 currentIndex,那么两个调用方同时遍历同一个列表就会争抢游标;若直接把内部 ArrayList 暴露出去,调用者又可以绕过集合的编辑规则。
19|中介者:把同事之间的交互规则集中管理
一次文章评审有多名编辑。若每个 Reviewer 都保存其他评审者列表,新增成员、排除发送者和划分评审室的规则就会复制到每个人身上。成员之间的引用关系也越来越复杂。
20|备忘录:保存状态,同时守住对象封装
草稿编辑器需要“回到刚才保存的状态”。历史管理器如果直接读取和修改编辑器的全部字段,就必须了解编辑器内部结构;每增加一个字段,都要检查历史模块是否一起更新。
22|状态:让合法动作随生命周期变化
文章处于草稿、已发布或已归档状态。草稿允许发布,已发布允许归档,已归档不能再次发布。若 publish 和 archive 各自包含一大段状态判断,每新增一个状态就要检查许多方法是否同步修改。
23|策略:通过组合替换一组算法
文章校对可以按篇固定收费,也可以按字数收费。如果 QuoteService 每次根据字符串类型判断公式,算法增加后,业务服务会不断积累与报价流程无关的细节。
24|模板方法:固定执行顺序,开放必要步骤
文章导出总要先校验和清理标题,再输出前缀、正文和后缀。Markdown 与带框文本的差异只在某些步骤。如果每个导出器自由实现 export,某个子类可能忘记校验,或把后缀拼在错误位置。