[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-settings":3,"\u002Farticles\u002Fdesign-pattern-34":26,"\u002Farticles\u002Fdesign-pattern-34\u002Frelated":43,"\u002Farticles\u002Fdesign-pattern-34\u002Fadjacent":72,"\u002Fcategories":94,"render-design-pattern-34":119},{"code":4,"message":5,"data":6},0,"ok",{"author_city":7,"author_years":8,"site_tagline":9,"site_description":10,"skill_one_desc":11,"author_status":12,"skill_two_title":13,"about_hero_image":9,"skill_one_title":14,"icp":15,"author_role":16,"og_default_image":9,"closing_quote_date":17,"toolkit":18,"skill_two_desc":19,"author_bio":9,"site_footer":9,"site_url":20,"author_tagline":21,"weekly_thought":9,"tagline_line_one":22,"author_bio_two":9,"closing_quote":23,"site_name":24,"tagline_line_two":25,"home_hero_image":9},"西安","10","","花开空白 - 个人博客","熟悉Java、Python、Go等后端语言。","努力工作中","前端开发","后端开发","陕ICP备2021009682号-1","开发者","2022年·秋","Java,JavaScript,TypeScript,Python,Go","熟悉Js、Ts语言以及Vue、uniapp等框架。","https:\u002F\u002Firule.cn","很高兴遇见你。","把复杂的事，","把每次一发布，都当成一次和陌生人的握手。","花开空白","写成简单的故事。",{"code":4,"message":5,"data":27},{"id":28,"slug":29,"title":30,"summary":31,"coverUrl":9,"categoryId":32,"status":33,"topFlag":4,"viewCount":34,"likeCount":4,"wordCount":35,"readingMinutes":36,"publishedAt":37,"contentMd":38,"contentHtml":39,"tags":40,"metaTitle":9,"metaDescription":9,"keywords":9,"canonicalUrl":9,"robots":41,"ogImage":9,"faq":42,"aiSummary":42},"2113935380699942913","design-pattern-34","设计模式修炼之路 ㉞ 六大原则再回首——殊途同归的总账","全系列收官篇。没有新模式，没有代码——只有一本记了三十二个模式的账。","2113897628365230081",1,2800,3601,10,"2025-07-18T11:29:45","> 全系列收官篇。没有新模式，没有代码——只有一本记了三十二个模式的账。\n\n㉝ 收官时说：三十二个模式各治一种痛，可每次诊断病灶、开出药方，反复露面的都是几张熟面孔。① 初识那篇速览过六大原则——当时它们只是六行背了就忘的定义；三十二篇走完再回头看，每一行背后都是一路踩过的坑。\n\n本篇把账本摊开：六条原则，一条条对——它们各自在哪些篇里救过场、打过折、或者连名字都没报过；最后算总账：为什么说它们殊途同归。\n\n## 一、先还一笔账：原则和模式是什么关系\n\n三样东西要分清：\n\n- **原则是\"为什么\"**——单一职责、开闭、里氏替换、依赖倒置、接口隔离、迪米特，六条判词，说的是代码\"该长什么样\"，但不给施工图\n- **模式是\"怎么办\"**——三十二个模式，每个都是针对一类问题的标准施工法，图纸齐全、验收明确\n- **反面教材是\"病历\"**——本系列每篇先演事故再开药方，那些事故拆开看，全是对某条原则的违反\n\n关系一句话：**原则是法律，模式是判例，反面教材是案发现场。** 顺带一笔：GoF 那本红皮书正文开篇其实只立了两条祖训——\"面向接口编程，而不是面向实现\"和\"组合优于继承\"；六大原则可以看作这两条加上开闭原则的展开版。下面逐条对账。\n\n## 二、开闭原则——全场 MVP\n\n定义一句话：**对扩展开放，对修改关闭**——新需求来了，加新代码，别改老代码。\n\n它是全系列出场率最高的原则，几乎每篇的\"疗效\"栏都有它：\n\n- ⑮ 策略：\"if-else 消失，开闭原则达成。新活动上线 = 加一个类 + 注册一行，老方法从此不动\"\n- ⑯ 观察者：\"开闭原则的达成方式和 ⑮ 一模一样：新变化 = 新类，不是改旧类\"\n- ⑩ 装饰器：\"新增一种配料 = 新写一个装饰器类，SimpleCoffee、Milk、Mocha 全都不用动\"\n- ⑨ 组合：\"实现 FileComponent 就能进树，全树所有遍历、统计、打印代码一行不改\"\n- ⑥ 适配器：\"两头都不改。Target 不动、Adaptee 不动，中间加一层就能协同工作\"\n- ⑧ 过滤器：\"加'品牌'筛选 = 新建一个 BrandCriteria 完事\"\n- ⑦ 桥接：\"加三角形只动形状树，加紫色只动颜色树，谁也不碰谁\"\n- ⑭ 模板：加变体就是加子类，extends 一个类填几个空就完事\n\n反面病历同样声势浩大：⑦ 的继承爆炸，是\"一处新增，处处开工，开闭原则碎了一地\"；㉒ 中介者的网状依赖，是\"赵六进群那一刻，张三、李四、王五的代码全都得改——开闭原则阵亡\"。\n\n还有两笔特别值得学的账。一笔是 ③ 工厂三兄弟的演进——本身就是开闭原则的得失史：简单工厂每加一个产品要改一处 switch，工厂方法把\"加产品\"变成\"加子类\"，开闭到手。另一笔是 ⑲ 状态模式\"开闭原则的成色\"那节的诚实账：\"状态模式对开闭原则的兑现是'打折扣'的\"——新状态是不改 if-else 矩阵了，但流转图上有边指向它的旧状态类，都得动。**开闭不是非黑即白的达标线，是每张设计图上的成色刻度。**\n\n## 三、单一职责——每个模式的入场券\n\n定义一句话：**一个类只有一个变化的理由。**\n\n它低调得多，但从没缺席。模范生名单：⑩ 装饰器\"每个装饰器只干一件事，Milk 只管加牛奶——单一职责原则的模范生\"；⑳ 迭代器\"聚合管存储，迭代器管遍历，单一职责各安其位\"；㉑ 备忘录\"角色管打包还原，管理器管保管调度，各自单一职责\"。\n\n真正的重头戏在 J2EE 八式——整卷都是单一职责的连续剧，每篇都在搬一次家：㉙ 把\"怎么存\"从业务对象家里搬走（\"业务对象不该懂数据库\"）；㉚ 把横切关注点从每个控制器家里搬进门神；㉜ 把\"怎么找服务\"从每家业务代码搬进定位器——\"技术细节全进了定位器，业务方法里只剩业务\"；㉝ 把\"运数据\"从实体身上拆出来，数据走 DTO，行为留在服务器。**J2EE 模式几乎没发明新东西，它们做的事本质都一样：把混在一起的两件事拆开，各自安家。**\n\n反面病历：⑨ 组合模式那张代价表里，单一职责和里氏替换一起躺枪——透明式让叶子被迫背着 add(child)，\"错误拖到运行时才炸\"。\n\n## 四、里氏替换与依赖倒置——继承与依赖的两条纪律\n\n这两条管的都是\"关系\"：一个管继承关系，一个管依赖关系。\n\n**里氏替换：子类必须能无痛顶替父类。** 全系列它正面对账只有一次——⑨ 组合模式的透明式 vs 安全式：透明式为了\"叶子容器一视同仁\"，让叶子也实现 add(child)，客户端拿着 leaf.add() 编译期不报错、运行时才炸——\"违背单一职责与里氏替换，错误拖到运行时才炸\"。为什么它出场这么少？因为系列一路的答案都是 GoF 第二祖训\"组合优于继承\"：⑩ 装饰器\"我是组件 + 我有组件\"，⑦ 桥接把继承爆炸拆成两棵独立的树，⑮⑲ 策略和状态用委托不用继承。**继承用得越少，里氏的考场越少——它像安全带，系好了就没人在意它。**\n\n**依赖倒置：依赖抽象，不依赖具体。** 它是\"面向接口编程\"的祖师爷，系列里到处是它的标本：② 单例篇就埋过\"依赖倒置\"的伏笔，⑥ 适配器应验了一次——\"Phone.charging(Voltage5V) 的参数是接口——手机依赖的是抽象而不是具体电源\"；⑯ 观察者的广播循环，\"observer.onOrderPaid(orderId) 这行代码就是'依赖倒置'的最小标本\"。往大处看：⑭ 模板的好莱坞原则长成了控制反转，是 Spring IoC 的源头之一；J2EE 八式整卷都在依赖倒置——㉗ 让表示层依赖业务话术接口，㉙ 让业务依赖 DAO 接口，㉜ 让客户端只认服务的名字。**每一处\"参数是接口、字段是接口\"，都是它的一次无声执法。**\n\n## 五、接口隔离与迪米特——两位没报名字的常客\n\n**接口隔离：别让调用方依赖它用不着的方法。** 全系列它一次名都没报过，却一直在场：⑧ 过滤器的 Criteria，一个接口只装一个条件；㉛ 拦截过滤器的 Filter 契约两句话——放行就 next，小到能背下来；㉙ DAO 接口只说业务语言，半个 SQL 的影子都没有；JDK 的 Comparable、Runnable、Callable，清一色单方法小接口。它的哲学：**接口是给调用方的承诺，承诺越少，承诺越硬。**\n\n**迪米特法则（最少知道原则）：只跟直接朋友说话。** 同样全程匿名，同样无处不在：⑪ 外观是它的专职模式——客户端只认识 SLF4J 一个门面，门后十几个日志框架互不认识；㉒ 中介者把网状依赖收成星型，同事们彼此不认识，只认识中介；㉘ 组合实体\"依赖对象没有远程身份\"，远程方只见主对象；㉝ 客户端只认识 DTO，实体长什么样它根本不知道。反面病历：㉝ 的细粒度接口，UI 直接摸到字段级——知道的越多，对方一改你越疼。**知道的越少，对方内部翻天，你越稳。**\n\n## 六、殊途同归——一张总账表\n\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>原则\u003C\u002Fth>\u003Cth>一句话\u003C\u002Fth>\u003Cth>全场代表作\u003C\u002Fth>\u003Cth>反面病历\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>开闭\u003C\u002Ftd>\u003Ctd>对扩展开放，对修改关闭\u003C\u002Ftd>\u003Ctd>⑮ 策略：新变化 = 新类，不是改旧类\u003C\u002Ftd>\u003Ctd>⑦ \"一处新增，处处开工\"；㉒ 赵六进群全员改\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>单一职责\u003C\u002Ftd>\u003Ctd>一个类只有一个变化的理由\u003C\u002Ftd>\u003Ctd>⑩ 装饰器：每个装饰器只干一件事\u003C\u002Ftd>\u003Ctd>㉙ 之前：业务对象懂数据库\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>里氏替换\u003C\u002Ftd>\u003Ctd>子类必须无痛顶替父类\u003C\u002Ftd>\u003Ctd>⑮ 策略族：任何实现都能顶上，调用方无感\u003C\u002Ftd>\u003Ctd>⑨ 透明式：错误拖到运行时才炸\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>依赖倒置\u003C\u002Ftd>\u003Ctd>依赖抽象，不依赖具体\u003C\u002Ftd>\u003Ctd>⑯ 观察者：广播一行，只认接口\u003C\u002Ftd>\u003Ctd>每一处把 new 具体类写死的地方\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>接口隔离\u003C\u002Ftd>\u003Ctd>不依赖用不着的方法\u003C\u002Ftd>\u003Ctd>㉛ Filter 契约两句话\u003C\u002Ftd>\u003Ctd>胖接口：塞给调用方一坨用不着的\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>迪米特\u003C\u002Ftd>\u003Ctd>只跟直接朋友说话\u003C\u002Ftd>\u003Ctd>⑪ 外观：全站只认识一个门\u003C\u002Ftd>\u003Ctd>㉝ 反面：UI 摸到字段级\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\n\n为什么说殊途同归？把六句话翻译成同一个问题——**变化来的时候，波及面有多大？** 开闭说：改动别扩散到老代码；单一职责说：一个变化只落在一个类上；里氏替换说：换实现别炸调用方；依赖倒置说：上层别认识下层的细节；接口隔离说：别把用不着的也捆进来；迪米特说：你只需要认识直接朋友。六条原则，六种说法，一个意思：**把变化关进小笼子。**\n\n模式就是造笼子的标准工艺。每本讲模式的书都念同一句心法——找到变化，封装变化——三十二个模式，拆开看每个都在回答\"这类变化用什么笼子装\"：算法会变，⑮ 装；步骤会变，⑭ 装；状态会变，⑲ 装；结构会变，⑨ 装；职责会变，⑩ 装；连\"对象从哪儿来\"会变，③⑤ 都备好了笼子。**原则划定笼子的验收标准，模式提供笼子的标准图纸**——这就是全部关系。\n\n## 写在最后\n\n- 原则是为什么，模式是怎么办，反面教材是案发现场——三十四篇，账都记在同一本上\n- 开闭是目标，其余五条是路径；⑲ 教的那课要记住：开闭是成色刻度，不是达标线\n- 单一职责是每个模式的入场券，J2EE 八式整卷都是职责搬家\n- 继承用得越少，里氏替换越安全——GoF 第二祖训\"组合优于继承\"一路都在执法\n- 接口隔离和迪米特全程匿名却无处不在——好原则像空气，用时方知在场\n- 殊途同归：六条原则一个问题——变化来了，波及面多大？把变化关进小笼子\n\n三十四篇至此收官。从 ② 那把双重校验锁开始，到 ㉝ 那份拎起来就能走的快照——模式会过时：㉜ 输给了依赖注入，蓝皮书的远程八式也被 RPC 框架收编成了注解。原则不会。下次面对一个两百行的类、一串嵌套的 if-else、一张谁也不敢动的表，不必急着想起某个模式的名字；先问一句：**这里什么在变？变化关进笼子了吗？**——答案出来的地方，模式自然会来赴约。修炼之路，到此功成；剩下的，在代码里见。\n","\u003Cblockquote>\n \u003Cp>全系列收官篇。没有新模式，没有代码——只有一本记了三十二个模式的账。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>㉝ 收官时说：三十二个模式各治一种痛，可每次诊断病灶、开出药方，反复露面的都是几张熟面孔。① 初识那篇速览过六大原则——当时它们只是六行背了就忘的定义；三十二篇走完再回头看，每一行背后都是一路踩过的坑。\u003C\u002Fp>\n\u003Cp>本篇把账本摊开：六条原则，一条条对——它们各自在哪些篇里救过场、打过折、或者连名字都没报过；最后算总账：为什么说它们殊途同归。\u003C\u002Fp>\n\u003Ch2>一、先还一笔账：原则和模式是什么关系\u003C\u002Fh2>\n\u003Cp>三样东西要分清：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cstrong>原则是\"为什么\"\u003C\u002Fstrong>——单一职责、开闭、里氏替换、依赖倒置、接口隔离、迪米特，六条判词，说的是代码\"该长什么样\"，但不给施工图\u003C\u002Fli>\n \u003Cli>\u003Cstrong>模式是\"怎么办\"\u003C\u002Fstrong>——三十二个模式，每个都是针对一类问题的标准施工法，图纸齐全、验收明确\u003C\u002Fli>\n \u003Cli>\u003Cstrong>反面教材是\"病历\"\u003C\u002Fstrong>——本系列每篇先演事故再开药方，那些事故拆开看，全是对某条原则的违反\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>关系一句话：\u003Cstrong>原则是法律，模式是判例，反面教材是案发现场。\u003C\u002Fstrong> 顺带一笔：GoF 那本红皮书正文开篇其实只立了两条祖训——\"面向接口编程，而不是面向实现\"和\"组合优于继承\"；六大原则可以看作这两条加上开闭原则的展开版。下面逐条对账。\u003C\u002Fp>\n\u003Ch2>二、开闭原则——全场 MVP\u003C\u002Fh2>\n\u003Cp>定义一句话：\u003Cstrong>对扩展开放，对修改关闭\u003C\u002Fstrong>——新需求来了，加新代码，别改老代码。\u003C\u002Fp>\n\u003Cp>它是全系列出场率最高的原则，几乎每篇的\"疗效\"栏都有它：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>⑮ 策略：\"if-else 消失，开闭原则达成。新活动上线 = 加一个类 + 注册一行，老方法从此不动\"\u003C\u002Fli>\n \u003Cli>⑯ 观察者：\"开闭原则的达成方式和 ⑮ 一模一样：新变化 = 新类，不是改旧类\"\u003C\u002Fli>\n \u003Cli>⑩ 装饰器：\"新增一种配料 = 新写一个装饰器类，SimpleCoffee、Milk、Mocha 全都不用动\"\u003C\u002Fli>\n \u003Cli>⑨ 组合：\"实现 FileComponent 就能进树，全树所有遍历、统计、打印代码一行不改\"\u003C\u002Fli>\n \u003Cli>⑥ 适配器：\"两头都不改。Target 不动、Adaptee 不动，中间加一层就能协同工作\"\u003C\u002Fli>\n \u003Cli>⑧ 过滤器：\"加'品牌'筛选 = 新建一个 BrandCriteria 完事\"\u003C\u002Fli>\n \u003Cli>⑦ 桥接：\"加三角形只动形状树，加紫色只动颜色树，谁也不碰谁\"\u003C\u002Fli>\n \u003Cli>⑭ 模板：加变体就是加子类，extends 一个类填几个空就完事\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>反面病历同样声势浩大：⑦ 的继承爆炸，是\"一处新增，处处开工，开闭原则碎了一地\"；㉒ 中介者的网状依赖，是\"赵六进群那一刻，张三、李四、王五的代码全都得改——开闭原则阵亡\"。\u003C\u002Fp>\n\u003Cp>还有两笔特别值得学的账。一笔是 ③ 工厂三兄弟的演进——本身就是开闭原则的得失史：简单工厂每加一个产品要改一处 switch，工厂方法把\"加产品\"变成\"加子类\"，开闭到手。另一笔是 ⑲ 状态模式\"开闭原则的成色\"那节的诚实账：\"状态模式对开闭原则的兑现是'打折扣'的\"——新状态是不改 if-else 矩阵了，但流转图上有边指向它的旧状态类，都得动。\u003Cstrong>开闭不是非黑即白的达标线，是每张设计图上的成色刻度。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch2>三、单一职责——每个模式的入场券\u003C\u002Fh2>\n\u003Cp>定义一句话：\u003Cstrong>一个类只有一个变化的理由。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>它低调得多，但从没缺席。模范生名单：⑩ 装饰器\"每个装饰器只干一件事，Milk 只管加牛奶——单一职责原则的模范生\"；⑳ 迭代器\"聚合管存储，迭代器管遍历，单一职责各安其位\"；㉑ 备忘录\"角色管打包还原，管理器管保管调度，各自单一职责\"。\u003C\u002Fp>\n\u003Cp>真正的重头戏在 J2EE 八式——整卷都是单一职责的连续剧，每篇都在搬一次家：㉙ 把\"怎么存\"从业务对象家里搬走（\"业务对象不该懂数据库\"）；㉚ 把横切关注点从每个控制器家里搬进门神；㉜ 把\"怎么找服务\"从每家业务代码搬进定位器——\"技术细节全进了定位器，业务方法里只剩业务\"；㉝ 把\"运数据\"从实体身上拆出来，数据走 DTO，行为留在服务器。\u003Cstrong>J2EE 模式几乎没发明新东西，它们做的事本质都一样：把混在一起的两件事拆开，各自安家。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>反面病历：⑨ 组合模式那张代价表里，单一职责和里氏替换一起躺枪——透明式让叶子被迫背着 add(child)，\"错误拖到运行时才炸\"。\u003C\u002Fp>\n\u003Ch2>四、里氏替换与依赖倒置——继承与依赖的两条纪律\u003C\u002Fh2>\n\u003Cp>这两条管的都是\"关系\"：一个管继承关系，一个管依赖关系。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>里氏替换：子类必须能无痛顶替父类。\u003C\u002Fstrong> 全系列它正面对账只有一次——⑨ 组合模式的透明式 vs 安全式：透明式为了\"叶子容器一视同仁\"，让叶子也实现 add(child)，客户端拿着 leaf.add() 编译期不报错、运行时才炸——\"违背单一职责与里氏替换，错误拖到运行时才炸\"。为什么它出场这么少？因为系列一路的答案都是 GoF 第二祖训\"组合优于继承\"：⑩ 装饰器\"我是组件 + 我有组件\"，⑦ 桥接把继承爆炸拆成两棵独立的树，⑮⑲ 策略和状态用委托不用继承。\u003Cstrong>继承用得越少，里氏的考场越少——它像安全带，系好了就没人在意它。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>依赖倒置：依赖抽象，不依赖具体。\u003C\u002Fstrong> 它是\"面向接口编程\"的祖师爷，系列里到处是它的标本：② 单例篇就埋过\"依赖倒置\"的伏笔，⑥ 适配器应验了一次——\"Phone.charging(Voltage5V) 的参数是接口——手机依赖的是抽象而不是具体电源\"；⑯ 观察者的广播循环，\"observer.onOrderPaid(orderId) 这行代码就是'依赖倒置'的最小标本\"。往大处看：⑭ 模板的好莱坞原则长成了控制反转，是 Spring IoC 的源头之一；J2EE 八式整卷都在依赖倒置——㉗ 让表示层依赖业务话术接口，㉙ 让业务依赖 DAO 接口，㉜ 让客户端只认服务的名字。\u003Cstrong>每一处\"参数是接口、字段是接口\"，都是它的一次无声执法。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch2>五、接口隔离与迪米特——两位没报名字的常客\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>接口隔离：别让调用方依赖它用不着的方法。\u003C\u002Fstrong> 全系列它一次名都没报过，却一直在场：⑧ 过滤器的 Criteria，一个接口只装一个条件；㉛ 拦截过滤器的 Filter 契约两句话——放行就 next，小到能背下来；㉙ DAO 接口只说业务语言，半个 SQL 的影子都没有；JDK 的 Comparable、Runnable、Callable，清一色单方法小接口。它的哲学：\u003Cstrong>接口是给调用方的承诺，承诺越少，承诺越硬。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>迪米特法则（最少知道原则）：只跟直接朋友说话。\u003C\u002Fstrong> 同样全程匿名，同样无处不在：⑪ 外观是它的专职模式——客户端只认识 SLF4J 一个门面，门后十几个日志框架互不认识；㉒ 中介者把网状依赖收成星型，同事们彼此不认识，只认识中介；㉘ 组合实体\"依赖对象没有远程身份\"，远程方只见主对象；㉝ 客户端只认识 DTO，实体长什么样它根本不知道。反面病历：㉝ 的细粒度接口，UI 直接摸到字段级——知道的越多，对方一改你越疼。\u003Cstrong>知道的越少，对方内部翻天，你越稳。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch2>六、殊途同归——一张总账表\u003C\u002Fh2>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>原则\u003C\u002Fth>\n   \u003Cth>一句话\u003C\u002Fth>\n   \u003Cth>全场代表作\u003C\u002Fth>\n   \u003Cth>反面病历\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>开闭\u003C\u002Ftd>\n   \u003Ctd>对扩展开放，对修改关闭\u003C\u002Ftd>\n   \u003Ctd>⑮ 策略：新变化 = 新类，不是改旧类\u003C\u002Ftd>\n   \u003Ctd>⑦ \"一处新增，处处开工\"；㉒ 赵六进群全员改\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>单一职责\u003C\u002Ftd>\n   \u003Ctd>一个类只有一个变化的理由\u003C\u002Ftd>\n   \u003Ctd>⑩ 装饰器：每个装饰器只干一件事\u003C\u002Ftd>\n   \u003Ctd>㉙ 之前：业务对象懂数据库\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>里氏替换\u003C\u002Ftd>\n   \u003Ctd>子类必须无痛顶替父类\u003C\u002Ftd>\n   \u003Ctd>⑮ 策略族：任何实现都能顶上，调用方无感\u003C\u002Ftd>\n   \u003Ctd>⑨ 透明式：错误拖到运行时才炸\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>依赖倒置\u003C\u002Ftd>\n   \u003Ctd>依赖抽象，不依赖具体\u003C\u002Ftd>\n   \u003Ctd>⑯ 观察者：广播一行，只认接口\u003C\u002Ftd>\n   \u003Ctd>每一处把 new 具体类写死的地方\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>接口隔离\u003C\u002Ftd>\n   \u003Ctd>不依赖用不着的方法\u003C\u002Ftd>\n   \u003Ctd>㉛ Filter 契约两句话\u003C\u002Ftd>\n   \u003Ctd>胖接口：塞给调用方一坨用不着的\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>迪米特\u003C\u002Ftd>\n   \u003Ctd>只跟直接朋友说话\u003C\u002Ftd>\n   \u003Ctd>⑪ 外观：全站只认识一个门\u003C\u002Ftd>\n   \u003Ctd>㉝ 反面：UI 摸到字段级\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>为什么说殊途同归？把六句话翻译成同一个问题——\u003Cstrong>变化来的时候，波及面有多大？\u003C\u002Fstrong> 开闭说：改动别扩散到老代码；单一职责说：一个变化只落在一个类上；里氏替换说：换实现别炸调用方；依赖倒置说：上层别认识下层的细节；接口隔离说：别把用不着的也捆进来；迪米特说：你只需要认识直接朋友。六条原则，六种说法，一个意思：\u003Cstrong>把变化关进小笼子。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>模式就是造笼子的标准工艺。每本讲模式的书都念同一句心法——找到变化，封装变化——三十二个模式，拆开看每个都在回答\"这类变化用什么笼子装\"：算法会变，⑮ 装；步骤会变，⑭ 装；状态会变，⑲ 装；结构会变，⑨ 装；职责会变，⑩ 装；连\"对象从哪儿来\"会变，③⑤ 都备好了笼子。\u003Cstrong>原则划定笼子的验收标准，模式提供笼子的标准图纸\u003C\u002Fstrong>——这就是全部关系。\u003C\u002Fp>\n\u003Ch2>写在最后\u003C\u002Fh2>\n\u003Cul>\n \u003Cli>原则是为什么，模式是怎么办，反面教材是案发现场——三十四篇，账都记在同一本上\u003C\u002Fli>\n \u003Cli>开闭是目标，其余五条是路径；⑲ 教的那课要记住：开闭是成色刻度，不是达标线\u003C\u002Fli>\n \u003Cli>单一职责是每个模式的入场券，J2EE 八式整卷都是职责搬家\u003C\u002Fli>\n \u003Cli>继承用得越少，里氏替换越安全——GoF 第二祖训\"组合优于继承\"一路都在执法\u003C\u002Fli>\n \u003Cli>接口隔离和迪米特全程匿名却无处不在——好原则像空气，用时方知在场\u003C\u002Fli>\n \u003Cli>殊途同归：六条原则一个问题——变化来了，波及面多大？把变化关进小笼子\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>三十四篇至此收官。从 ② 那把双重校验锁开始，到 ㉝ 那份拎起来就能走的快照——模式会过时：㉜ 输给了依赖注入，蓝皮书的远程八式也被 RPC 框架收编成了注解。原则不会。下次面对一个两百行的类、一串嵌套的 if-else、一张谁也不敢动的表，不必急着想起某个模式的名字；先问一句：\u003Cstrong>这里什么在变？变化关进笼子了吗？\u003C\u002Fstrong>——答案出来的地方，模式自然会来赴约。修炼之路，到此功成；剩下的，在代码里见。\u003C\u002Fp>",[],"index,follow",null,{"code":4,"message":5,"data":44},[45,54,63],{"id":46,"slug":47,"title":48,"summary":49,"coverUrl":9,"categoryId":32,"status":33,"topFlag":4,"viewCount":50,"likeCount":4,"wordCount":51,"readingMinutes":52,"publishedAt":53},"2113907939247919106","design-pattern-01","设计模式修炼之路 ① 初识设计模式——先把地图摊开","这是系列的第一篇，没有一行代码：设计模式是什么、模式分哪四大家族、六大原则长什么样。先把地图摊开，路从下一篇开始走。",3268,1903,5,"2023-09-10T12:19:35",{"id":55,"slug":56,"title":57,"summary":58,"coverUrl":9,"categoryId":32,"status":33,"topFlag":4,"viewCount":59,"likeCount":4,"wordCount":60,"readingMinutes":61,"publishedAt":62},"2113931965261418497","design-pattern-15","设计模式修炼之路 ⑮ 策略模式——if-else 的解药","一个分支一个类、工厂加 Map 连选择处都不写 if-else、Spring 自动收集、线程池拒绝策略",1681,7953,20,"2024-06-16T18:10:44",{"id":64,"slug":65,"title":66,"summary":67,"coverUrl":9,"categoryId":32,"status":33,"topFlag":4,"viewCount":68,"likeCount":4,"wordCount":69,"readingMinutes":70,"publishedAt":71},"2113931131085656066","design-pattern-03","设计模式修炼之路 ③ 工厂模式——简单工厂、工厂方法、抽象工厂三兄弟","简单工厂、工厂方法、抽象工厂三兄弟的演进与取舍、开闭原则得失",3741,6415,17,"2023-10-13T21:36:05",{"code":4,"message":5,"data":73},{"prev":74,"next":83},{"id":75,"slug":76,"title":77,"summary":78,"coverUrl":9,"categoryId":32,"status":33,"topFlag":4,"viewCount":79,"likeCount":4,"wordCount":80,"readingMinutes":81,"publishedAt":82},"2113935321048551425","design-pattern-33","设计模式修炼之路 ㉝ 传输对象模式——一趟网络，带走整份数据","J2EE 模式第八站，也是 J2EE 八式的收官一站。",2516,8059,21,"2025-07-09T21:16:41",{"id":84,"slug":85,"title":86,"summary":87,"coverUrl":88,"categoryId":89,"status":33,"topFlag":33,"viewCount":90,"likeCount":4,"wordCount":91,"readingMinutes":92,"publishedAt":93},"2105199707045675010","kugit-smartgit-gitclient","找一个能平替 SmartGit 的轻量 Git 客户端？试试 KuGit","KuGit 是一款仅 6.7 MB 的 Windows Git 桌面客户端，底层直接调用系统 git，行为与命令行完全一致。它支持多仓库分组与同步状态总览、可拖拽停靠的面板布局、提交图谱与搜索、逐词差异高亮、文件历史与 Blame、冲突解决、贮藏\u002F合并\u002F变基中止等日常操作，并提供明暗主题、中英双语界面、凭据与 SSH 密钥管理以及带 Ed25519 签名校验的自动更新。文章逐项演示了各功能，并客观对比其与 SmartGit 的差异：日常场景下 KuGit 更轻更快，但暂无 macOS\u002FLinux 版本，也缺少交互式变基与 PR 集成，适合作为 Windows 上的日常主力 Git 工具。","https:\u002F\u002Firule.cn\u002Fku-blog\u002Fposts\u002F2026\u002F09\u002F30\u002Ff33ea38ad6b8479c8535d516645f05de.webp","2105200093764698113",6,2776,7,"2026-09-30T17:48:03",{"code":4,"message":5,"data":95},[96,102,107,113],{"id":97,"name":98,"slug":99,"description":100,"sortOrder":4,"articleCount":101},"1946000000000000001","antlr4","tech","编程与技术笔记","13",{"id":32,"name":103,"slug":104,"description":105,"sortOrder":4,"articleCount":106},"设计模式","design-pattern","设计模式系列","34",{"id":108,"name":109,"slug":110,"description":111,"sortOrder":33,"articleCount":112},"1946000000000000002","随笔","essay","生活与思考","0",{"id":89,"name":114,"slug":115,"description":116,"sortOrder":117,"articleCount":118},"工具","tools","好用的工具推荐",2,"1",{"html":120,"toc":121},"\u003Cblockquote>\n \u003Cp>全系列收官篇。没有新模式，没有代码——只有一本记了三十二个模式的账。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>㉝ 收官时说：三十二个模式各治一种痛，可每次诊断病灶、开出药方，反复露面的都是几张熟面孔。① 初识那篇速览过六大原则——当时它们只是六行背了就忘的定义；三十二篇走完再回头看，每一行背后都是一路踩过的坑。\u003C\u002Fp>\n\u003Cp>本篇把账本摊开：六条原则，一条条对——它们各自在哪些篇里救过场、打过折、或者连名字都没报过；最后算总账：为什么说它们殊途同归。\u003C\u002Fp>\n\u003Ch2 id=\"toc-1\">一、先还一笔账：原则和模式是什么关系\u003C\u002Fh2>\n\u003Cp>三样东西要分清：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cstrong>原则是\"为什么\"\u003C\u002Fstrong>——单一职责、开闭、里氏替换、依赖倒置、接口隔离、迪米特，六条判词，说的是代码\"该长什么样\"，但不给施工图\u003C\u002Fli>\n \u003Cli>\u003Cstrong>模式是\"怎么办\"\u003C\u002Fstrong>——三十二个模式，每个都是针对一类问题的标准施工法，图纸齐全、验收明确\u003C\u002Fli>\n \u003Cli>\u003Cstrong>反面教材是\"病历\"\u003C\u002Fstrong>——本系列每篇先演事故再开药方，那些事故拆开看，全是对某条原则的违反\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>关系一句话：\u003Cstrong>原则是法律，模式是判例，反面教材是案发现场。\u003C\u002Fstrong> 顺带一笔：GoF 那本红皮书正文开篇其实只立了两条祖训——\"面向接口编程，而不是面向实现\"和\"组合优于继承\"；六大原则可以看作这两条加上开闭原则的展开版。下面逐条对账。\u003C\u002Fp>\n\u003Ch2 id=\"toc-2\">二、开闭原则——全场 MVP\u003C\u002Fh2>\n\u003Cp>定义一句话：\u003Cstrong>对扩展开放，对修改关闭\u003C\u002Fstrong>——新需求来了，加新代码，别改老代码。\u003C\u002Fp>\n\u003Cp>它是全系列出场率最高的原则，几乎每篇的\"疗效\"栏都有它：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>⑮ 策略：\"if-else 消失，开闭原则达成。新活动上线 = 加一个类 + 注册一行，老方法从此不动\"\u003C\u002Fli>\n \u003Cli>⑯ 观察者：\"开闭原则的达成方式和 ⑮ 一模一样：新变化 = 新类，不是改旧类\"\u003C\u002Fli>\n \u003Cli>⑩ 装饰器：\"新增一种配料 = 新写一个装饰器类，SimpleCoffee、Milk、Mocha 全都不用动\"\u003C\u002Fli>\n \u003Cli>⑨ 组合：\"实现 FileComponent 就能进树，全树所有遍历、统计、打印代码一行不改\"\u003C\u002Fli>\n \u003Cli>⑥ 适配器：\"两头都不改。Target 不动、Adaptee 不动，中间加一层就能协同工作\"\u003C\u002Fli>\n \u003Cli>⑧ 过滤器：\"加'品牌'筛选 = 新建一个 BrandCriteria 完事\"\u003C\u002Fli>\n \u003Cli>⑦ 桥接：\"加三角形只动形状树，加紫色只动颜色树，谁也不碰谁\"\u003C\u002Fli>\n \u003Cli>⑭ 模板：加变体就是加子类，extends 一个类填几个空就完事\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>反面病历同样声势浩大：⑦ 的继承爆炸，是\"一处新增，处处开工，开闭原则碎了一地\"；㉒ 中介者的网状依赖，是\"赵六进群那一刻，张三、李四、王五的代码全都得改——开闭原则阵亡\"。\u003C\u002Fp>\n\u003Cp>还有两笔特别值得学的账。一笔是 ③ 工厂三兄弟的演进——本身就是开闭原则的得失史：简单工厂每加一个产品要改一处 switch，工厂方法把\"加产品\"变成\"加子类\"，开闭到手。另一笔是 ⑲ 状态模式\"开闭原则的成色\"那节的诚实账：\"状态模式对开闭原则的兑现是'打折扣'的\"——新状态是不改 if-else 矩阵了，但流转图上有边指向它的旧状态类，都得动。\u003Cstrong>开闭不是非黑即白的达标线，是每张设计图上的成色刻度。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch2 id=\"toc-3\">三、单一职责——每个模式的入场券\u003C\u002Fh2>\n\u003Cp>定义一句话：\u003Cstrong>一个类只有一个变化的理由。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>它低调得多，但从没缺席。模范生名单：⑩ 装饰器\"每个装饰器只干一件事，Milk 只管加牛奶——单一职责原则的模范生\"；⑳ 迭代器\"聚合管存储，迭代器管遍历，单一职责各安其位\"；㉑ 备忘录\"角色管打包还原，管理器管保管调度，各自单一职责\"。\u003C\u002Fp>\n\u003Cp>真正的重头戏在 J2EE 八式——整卷都是单一职责的连续剧，每篇都在搬一次家：㉙ 把\"怎么存\"从业务对象家里搬走（\"业务对象不该懂数据库\"）；㉚ 把横切关注点从每个控制器家里搬进门神；㉜ 把\"怎么找服务\"从每家业务代码搬进定位器——\"技术细节全进了定位器，业务方法里只剩业务\"；㉝ 把\"运数据\"从实体身上拆出来，数据走 DTO，行为留在服务器。\u003Cstrong>J2EE 模式几乎没发明新东西，它们做的事本质都一样：把混在一起的两件事拆开，各自安家。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>反面病历：⑨ 组合模式那张代价表里，单一职责和里氏替换一起躺枪——透明式让叶子被迫背着 add(child)，\"错误拖到运行时才炸\"。\u003C\u002Fp>\n\u003Ch2 id=\"toc-4\">四、里氏替换与依赖倒置——继承与依赖的两条纪律\u003C\u002Fh2>\n\u003Cp>这两条管的都是\"关系\"：一个管继承关系，一个管依赖关系。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>里氏替换：子类必须能无痛顶替父类。\u003C\u002Fstrong> 全系列它正面对账只有一次——⑨ 组合模式的透明式 vs 安全式：透明式为了\"叶子容器一视同仁\"，让叶子也实现 add(child)，客户端拿着 leaf.add() 编译期不报错、运行时才炸——\"违背单一职责与里氏替换，错误拖到运行时才炸\"。为什么它出场这么少？因为系列一路的答案都是 GoF 第二祖训\"组合优于继承\"：⑩ 装饰器\"我是组件 + 我有组件\"，⑦ 桥接把继承爆炸拆成两棵独立的树，⑮⑲ 策略和状态用委托不用继承。\u003Cstrong>继承用得越少，里氏的考场越少——它像安全带，系好了就没人在意它。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>依赖倒置：依赖抽象，不依赖具体。\u003C\u002Fstrong> 它是\"面向接口编程\"的祖师爷，系列里到处是它的标本：② 单例篇就埋过\"依赖倒置\"的伏笔，⑥ 适配器应验了一次——\"Phone.charging(Voltage5V) 的参数是接口——手机依赖的是抽象而不是具体电源\"；⑯ 观察者的广播循环，\"observer.onOrderPaid(orderId) 这行代码就是'依赖倒置'的最小标本\"。往大处看：⑭ 模板的好莱坞原则长成了控制反转，是 Spring IoC 的源头之一；J2EE 八式整卷都在依赖倒置——㉗ 让表示层依赖业务话术接口，㉙ 让业务依赖 DAO 接口，㉜ 让客户端只认服务的名字。\u003Cstrong>每一处\"参数是接口、字段是接口\"，都是它的一次无声执法。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch2 id=\"toc-5\">五、接口隔离与迪米特——两位没报名字的常客\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>接口隔离：别让调用方依赖它用不着的方法。\u003C\u002Fstrong> 全系列它一次名都没报过，却一直在场：⑧ 过滤器的 Criteria，一个接口只装一个条件；㉛ 拦截过滤器的 Filter 契约两句话——放行就 next，小到能背下来；㉙ DAO 接口只说业务语言，半个 SQL 的影子都没有；JDK 的 Comparable、Runnable、Callable，清一色单方法小接口。它的哲学：\u003Cstrong>接口是给调用方的承诺，承诺越少，承诺越硬。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>迪米特法则（最少知道原则）：只跟直接朋友说话。\u003C\u002Fstrong> 同样全程匿名，同样无处不在：⑪ 外观是它的专职模式——客户端只认识 SLF4J 一个门面，门后十几个日志框架互不认识；㉒ 中介者把网状依赖收成星型，同事们彼此不认识，只认识中介；㉘ 组合实体\"依赖对象没有远程身份\"，远程方只见主对象；㉝ 客户端只认识 DTO，实体长什么样它根本不知道。反面病历：㉝ 的细粒度接口，UI 直接摸到字段级——知道的越多，对方一改你越疼。\u003Cstrong>知道的越少，对方内部翻天，你越稳。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch2 id=\"toc-6\">六、殊途同归——一张总账表\u003C\u002Fh2>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>原则\u003C\u002Fth>\n   \u003Cth>一句话\u003C\u002Fth>\n   \u003Cth>全场代表作\u003C\u002Fth>\n   \u003Cth>反面病历\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>开闭\u003C\u002Ftd>\n   \u003Ctd>对扩展开放，对修改关闭\u003C\u002Ftd>\n   \u003Ctd>⑮ 策略：新变化 = 新类，不是改旧类\u003C\u002Ftd>\n   \u003Ctd>⑦ \"一处新增，处处开工\"；㉒ 赵六进群全员改\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>单一职责\u003C\u002Ftd>\n   \u003Ctd>一个类只有一个变化的理由\u003C\u002Ftd>\n   \u003Ctd>⑩ 装饰器：每个装饰器只干一件事\u003C\u002Ftd>\n   \u003Ctd>㉙ 之前：业务对象懂数据库\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>里氏替换\u003C\u002Ftd>\n   \u003Ctd>子类必须无痛顶替父类\u003C\u002Ftd>\n   \u003Ctd>⑮ 策略族：任何实现都能顶上，调用方无感\u003C\u002Ftd>\n   \u003Ctd>⑨ 透明式：错误拖到运行时才炸\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>依赖倒置\u003C\u002Ftd>\n   \u003Ctd>依赖抽象，不依赖具体\u003C\u002Ftd>\n   \u003Ctd>⑯ 观察者：广播一行，只认接口\u003C\u002Ftd>\n   \u003Ctd>每一处把 new 具体类写死的地方\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>接口隔离\u003C\u002Ftd>\n   \u003Ctd>不依赖用不着的方法\u003C\u002Ftd>\n   \u003Ctd>㉛ Filter 契约两句话\u003C\u002Ftd>\n   \u003Ctd>胖接口：塞给调用方一坨用不着的\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>迪米特\u003C\u002Ftd>\n   \u003Ctd>只跟直接朋友说话\u003C\u002Ftd>\n   \u003Ctd>⑪ 外观：全站只认识一个门\u003C\u002Ftd>\n   \u003Ctd>㉝ 反面：UI 摸到字段级\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>为什么说殊途同归？把六句话翻译成同一个问题——\u003Cstrong>变化来的时候，波及面有多大？\u003C\u002Fstrong> 开闭说：改动别扩散到老代码；单一职责说：一个变化只落在一个类上；里氏替换说：换实现别炸调用方；依赖倒置说：上层别认识下层的细节；接口隔离说：别把用不着的也捆进来；迪米特说：你只需要认识直接朋友。六条原则，六种说法，一个意思：\u003Cstrong>把变化关进小笼子。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>模式就是造笼子的标准工艺。每本讲模式的书都念同一句心法——找到变化，封装变化——三十二个模式，拆开看每个都在回答\"这类变化用什么笼子装\"：算法会变，⑮ 装；步骤会变，⑭ 装；状态会变，⑲ 装；结构会变，⑨ 装；职责会变，⑩ 装；连\"对象从哪儿来\"会变，③⑤ 都备好了笼子。\u003Cstrong>原则划定笼子的验收标准，模式提供笼子的标准图纸\u003C\u002Fstrong>——这就是全部关系。\u003C\u002Fp>\n\u003Ch2 id=\"toc-7\">写在最后\u003C\u002Fh2>\n\u003Cul>\n \u003Cli>原则是为什么，模式是怎么办，反面教材是案发现场——三十四篇，账都记在同一本上\u003C\u002Fli>\n \u003Cli>开闭是目标，其余五条是路径；⑲ 教的那课要记住：开闭是成色刻度，不是达标线\u003C\u002Fli>\n \u003Cli>单一职责是每个模式的入场券，J2EE 八式整卷都是职责搬家\u003C\u002Fli>\n \u003Cli>继承用得越少，里氏替换越安全——GoF 第二祖训\"组合优于继承\"一路都在执法\u003C\u002Fli>\n \u003Cli>接口隔离和迪米特全程匿名却无处不在——好原则像空气，用时方知在场\u003C\u002Fli>\n \u003Cli>殊途同归：六条原则一个问题——变化来了，波及面多大？把变化关进小笼子\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>三十四篇至此收官。从 ② 那把双重校验锁开始，到 ㉝ 那份拎起来就能走的快照——模式会过时：㉜ 输给了依赖注入，蓝皮书的远程八式也被 RPC 框架收编成了注解。原则不会。下次面对一个两百行的类、一串嵌套的 if-else、一张谁也不敢动的表，不必急着想起某个模式的名字；先问一句：\u003Cstrong>这里什么在变？变化关进笼子了吗？\u003C\u002Fstrong>——答案出来的地方，模式自然会来赴约。修炼之路，到此功成；剩下的，在代码里见。\u003C\u002Fp>",[122,125,128,131,134,137,140],{"id":123,"text":124,"level":117},"toc-1","一、先还一笔账：原则和模式是什么关系",{"id":126,"text":127,"level":117},"toc-2","二、开闭原则——全场 MVP",{"id":129,"text":130,"level":117},"toc-3","三、单一职责——每个模式的入场券",{"id":132,"text":133,"level":117},"toc-4","四、里氏替换与依赖倒置——继承与依赖的两条纪律",{"id":135,"text":136,"level":117},"toc-5","五、接口隔离与迪米特——两位没报名字的常客",{"id":138,"text":139,"level":117},"toc-6","六、殊途同归——一张总账表",{"id":141,"text":142,"level":117},"toc-7","写在最后"]