10|组合:让叶子与容器接受同一种操作
博客导航里,栏目可以包含文章,也可以包含子栏目。统计整个知识库有多少篇文章时,调用方若不断判断“这是文章还是栏目”,每增加一种嵌套层次都要重复处理结构细节。
11|装饰器:通过包装逐层增加行为
文本展示需要去除首尾空白,有些页面还需要外层方括号。若用继承表示“原文本”“去空白文本”“带框文本”“去空白且带框文本”,组合一多,子类就会迅速增长。
15|责任链:让请求按明确规则经过处理节点
文章发布需要检查标题和权限。最初把它们写进一个方法很简单,但不同入口逐渐需要不同校验组合,且失败提示取决于先检查哪一项。继续复制 if 会让规则顺序分散。
17|解释器:用对象树表达一门小语言
文章筛选规则需要表达“带 java 标签,并且带 oop 或 gradle 标签”。散落在页面里的布尔表达式无法作为配置组合、复用或逐节点检查。我们可以把规则的语法结构直接建成对象树。
18|迭代器:把遍历状态从集合中取出来
阅读列表需要顺序展示文章。若集合自身保存一个 currentIndex,那么两个调用方同时遍历同一个列表就会争抢游标;若直接把内部 ArrayList 暴露出去,调用者又可以绕过集合的编辑规则。
19|中介者:把同事之间的交互规则集中管理
一次文章评审有多名编辑。若每个 Reviewer 都保存其他评审者列表,新增成员、排除发送者和划分评审室的规则就会复制到每个人身上。成员之间的引用关系也越来越复杂。