08|适配器:把旧接口翻译成业务契约
文章发布服务希望调用 send(recipient, body),旧邮件组件却提供 deliver(content, address)。两个参数恰好都是 String,传反也能编译。若业务代码到处记住旧接口的顺序,未来替换组件时就要修改许多调用位置。
09|桥接:拆开业务类型与实现方式两条变化轴
通知有普通提示与警报两种业务类型,也有纯文本与 Markdown 两种呈现方式。如果用继承枚举组合,会出现 TextInfoNotice、MarkdownInfoNotice、TextAlertNotice、MarkdownAlertNotice;新增一种呈现方式后,还要再增加一整排组合类。
10|组合:让叶子与容器接受同一种操作
博客导航里,栏目可以包含文章,也可以包含子栏目。统计整个知识库有多少篇文章时,调用方若不断判断“这是文章还是栏目”,每增加一种嵌套层次都要重复处理结构细节。
11|装饰器:通过包装逐层增加行为
文本展示需要去除首尾空白,有些页面还需要外层方括号。若用继承表示“原文本”“去空白文本”“带框文本”“去空白且带框文本”,组合一多,子类就会迅速增长。
15|责任链:让请求按明确规则经过处理节点
文章发布需要检查标题和权限。最初把它们写进一个方法很简单,但不同入口逐渐需要不同校验组合,且失败提示取决于先检查哪一项。继续复制 if 会让规则顺序分散。
17|解释器:用对象树表达一门小语言
文章筛选规则需要表达“带 java 标签,并且带 oop 或 gradle 标签”。散落在页面里的布尔表达式无法作为配置组合、复用或逐节点检查。我们可以把规则的语法结构直接建成对象树。