20|备忘录:保存状态,同时守住对象封装
草稿编辑器需要“回到刚才保存的状态”。历史管理器如果直接读取和修改编辑器的全部字段,就必须了解编辑器内部结构;每增加一个字段,都要检查历史模块是否一起更新。
22|状态:让合法动作随生命周期变化
文章处于草稿、已发布或已归档状态。草稿允许发布,已发布允许归档,已归档不能再次发布。若 publish 和 archive 各自包含一大段状态判断,每新增一个状态就要检查许多方法是否同步修改。
23|策略:通过组合替换一组算法
文章校对可以按篇固定收费,也可以按字数收费。如果 QuoteService 每次根据字符串类型判断公式,算法增加后,业务服务会不断积累与报价流程无关的细节。
24|模板方法:固定执行顺序,开放必要步骤
文章导出总要先校验和清理标题,再输出前缀、正文和后缀。Markdown 与带框文本的差异只在某些步骤。如果每个导出器自由实现 export,某个子类可能忘记校验,或把后缀拼在错误位置。
25|访问者:在稳定元素结构上持续增加操作
博客文档包含段落和代码块。现在要导出 Markdown,随后还要生成摘要。如果每个元素都不断增加 exportMarkdown、summarize、validate 等方法,元素类会逐渐混入许多用途不同的操作。
26|设计模式选型与综合复盘:把变化、契约和测试连起来
学完24种模式之后,最容易出现的新问题是“任何需求都想套模式”。一个小服务被拆成很多接口,每个实现都只有一处使用,修改时却仍然到处联动。模式没有消除复杂性,只改变了复杂性所在的位置;是否值得引入,要看这份改变是否服务于真实需求。