当前位置: 首页 > news >正文

设计模式 23 · 收尾总纲:把二十三式串成一张地图

到这里,「设计模式拆解」系列的正文就要收尾了。从第 1 篇的七大设计原则出发,我们一路走过了创建型 5 个、结构型 7 个、行为型 11 个,共二十三个 GoF 模式(其中冷门的三个合并在一篇讲)。这最后一篇不引入任何新模式,而是做四件事:把散落的模式盘进你天天用的源码里、集中辨析那几对最容易混的模式、再郑重地谈一次"过度设计"、最后把二十三式和七大原则收拢成一张完整的地图。读完这篇,前面二十二篇在你脑子里就不再是二十二个孤立的知识点,而是一个有主线、有脉络的整体。

目录

  1. 源码里的模式:你早就在用它们
  2. 最容易混的几对模式,集中辨析
  3. 再谈过度设计:模式的正确打开方式
  4. 一张全景地图:二十三式 × 七原则

一、源码里的模式:你早就在用它们

学模式最好的方式,是在你天天用的框架源码里认出它们。把前面各篇提到的现实身影汇总一下,你会发现:设计模式不是书本上的理论,而是所有优秀框架的通用语言。

JDK 里的模式:

  • 单例:Runtime.getRuntime()
  • 工厂:Calendar.getInstance()Collection.iterator()(工厂方法)、Connection(抽象工厂)
  • 建造者:StringBuilderStream.builder()
  • 原型:Object.clone()ArrayList.clone()(浅拷贝)
  • 适配器:InputStreamReader(字节流转字符流)、Arrays.asList()
  • 装饰器:整个java.io(BufferedInputStreamFileInputStream)
  • 享元:Integer缓存(−128~127)、String常量池
  • 代理:java.lang.reflect.Proxy(动态代理)
  • 迭代器:Iterator/Iterablefor-each
  • 观察者:java.util.Observer(已废弃)
  • 模板方法:AbstractListHttpServlet
  • 命令:Runnable
  • 责任链:ServletFilter
  • 策略:ComparatorThreadPoolExecutor拒绝策略

Spring 里的模式(几乎用全了):

  • 单例:Bean 默认作用域(容器级单例)
  • 工厂:BeanFactoryFactoryBean
  • 代理:AOP(JDK 动态代理 / CGLIB)——@Transactional@Cacheable的底座
  • 模板方法:JdbcTemplateRestTemplate、各种Template
  • 观察者:ApplicationEvent+@EventListener事件机制
  • 适配器:Spring MVC 的HandlerAdapter
  • 责任链:HandlerInterceptor拦截器链
  • 策略:Resource加载、各种可插拔策略
  • 装饰器:BeanWrapper、各种Wrapper
  • 外观:对复杂子系统的封装门面

MyBatis 里的模式:

  • 建造者:SqlSessionFactoryBuilder
  • 代理:Mapper 接口的动态代理(你只写接口没写实现,却能调用)
  • 工厂:SqlSessionFactory

看到这个清单,你应该有两个体会:其一,你其实早就在用设计模式了,只是以前没意识到;其二,能读懂这些框架的设计,靠的正是对模式的理解——当你知道@Transactional底层是代理、JdbcTemplate是模板方法、@EventListener是观察者,框架对你就不再是黑魔法,而是一套你能看懂、能推理的设计。这就是学模式最实在的回报。

二、最容易混的几对模式,集中辨析

前面各篇里,我们一对对地辨析过那些"长得像"的模式。这里集中收拢,做一张"傻傻分不清"速查表——这几对是最高频的困惑点,一次记牢:

易混的一对关键区别一句话记忆
工厂 vs 建造者工厂管"造哪个"(选类型),建造者管"怎么一步步造好一个"(装配)工厂选择,建造者装配
工厂方法 vs 抽象工厂工厂方法造一个产品,抽象工厂造一整族配套产品一个 vs 一族
代理 vs 装饰器结构几乎一样,代理管"控制访问",装饰器管"增强功能"代理把关,装饰加料
装饰器 vs 适配器装饰器不改接口(增强),适配器改接口(转换)增强 vs 转换
代理 vs 适配器 vs 装饰器看接口:代理/装饰器接口不变,适配器接口变只有适配器改接口
策略 vs 状态结构几乎一样,策略是平行选一个算法,状态是按规则流转能画状态图的是状态
策略 vs 模板方法策略用组合换整个算法,模板方法用继承换其中几步换整个 vs 换几步
命令 vs 备忘录(撤销)命令记"逆操作"(增量),备忘录存"快照"(全量)反着做 vs 存整个
外观 vs 中介者外观单向(简化外部调用),中介者双向(协调内部交互)单向门面 vs 双向协调
桥接 vs 策略桥接分离两个长期演化的维度,策略替换一个算法分两轴 vs 换一算法

这张表里藏着一个深刻的规律:很多模式的类图几乎完全一样(代理/装饰器/适配器、策略/状态),区别根本不在结构,而在意图。这就是为什么"背 UML"学不好设计模式——因为光看结构,你分不清代理和装饰器。真正区分它们的,是"你想解决什么问题"。这也是本系列从头到尾强调"每个模式解决什么变化"、而不是"每个模式的类图长什么样"的原因。

三、再谈过度设计:模式的正确打开方式

从第 1 篇到现在,"别过度设计"这句话我在几乎每一篇都说了一遍。收尾了,必须把它作为最重要的一课郑重强调:学完二十三式,最大的风险不是"不会用",而是"到处用"。

一个刚学完设计模式的人,最典型的病症是:看什么代码都觉得"不够优雅",忍不住想套个模式;一个只有一种实现的接口非要配个工厂,一个永远两分支的判断非要拆成策略,一个三字段的对象非要上建造者……结果代码里全是接口、抽象类、各种 Xxx-Factory / Xxx-Strategy,跳转七八层才找到真正干活的那一行。这种"为了用模式而用模式"的代码,比不用任何模式的朴素代码更难维护。

请记住这几条,它们比二十三式本身更重要:

  • 模式是用来解决"真实存在的变化"的,不是用来炫技的。先有值得解决的问题(这个维度真的在频繁扩展、这里真的有多种实现要切换),才谈得上用模式。没有问题硬套模式,就是过度设计。
  • YAGNI(You Aren’t Gonna Need It):你不会需要它。别为"想象中未来可能有的扩展"提前铺一堆抽象。那个"未来"往往永远不来,而你为它付出的复杂度是当下就要承受的。
  • 能用简单方案解决,就别上模式。一个if-else、一个直接new、一个普通方法,如果清晰够用,那它就是最好的设计。简单不是低级,清晰才是高级。
  • 模式的引入应该是"重构出来的",而不是"设计出来的"。更健康的路径是:先写朴素的代码,当它真的开始因为某个变化而变得难受时(if-else 越来越长、复制粘贴越来越多),再用对应的模式去重构它。让模式在真实的痛点处自然长出来,而不是一开始就凭想象堆砌。

设计的最高境界,不是"用了多少模式",而是**“用最简单的结构,恰好解决了当前的问题,并为已经看清的变化留了余地”。二十三式给你的,是一套"当变化真的来临时,该怎么优雅应对"的标准答案库;但什么时候该翻开这个答案库、翻到哪一页,靠的是判断力**——而判断力的核心,就是分清"真实的变化"和"想象的变化"。

四、一张全景地图:二十三式 × 七原则

最后,把整个系列收拢成一张地图。二十三个模式按三大类归位,每个标出它主要贯彻的设计原则——你会看到,所有模式的底层,都是那七条原则(尤其是"组合优于继承"和"面向接口/依赖倒置")在不同场景下的具体落地。

从这张图里,能读出贯穿全系列的几条主线:

  • "组合优于继承"是结构型的灵魂:代理、装饰器、适配器、桥接,几乎全在用"持有一个对象"代替"继承一个类"。这是本系列被验证次数最多的一条原则。
  • "面向接口 + 依赖倒置"是几乎所有模式的地基:工厂、策略、观察者、状态、命令……无一不是"依赖一个抽象接口,而不是具体实现",再通过多态或注入切换具体实现。
  • "隔离变化点"是所有模式的共同目的:每一个模式,本质上都是先识别出"这里有什么会变"(创建方式?算法?接口?状态?),然后给这个变化点一层抽象,把它和稳定的部分隔开。
  • "开闭原则"是所有模式追求的效果:用了模式之后,面对变化时你几乎总能做到"新增代码而非修改代码"。

所以,如果要用一句话总结这整个系列,那就是:设计模式不是二十三个孤立的技巧,而是七大原则在"应对变化、降低耦合"这个共同目标下,结出的二十三颗果实。你真正要掌握的,不是二十三个模板,而是那套"识别变化 → 抽象隔离 → 面向接口 → 优先组合"的思维方式。模式会忘,思维方式不会。


全系列小结。「设计模式拆解」到此收官。我们从七大设计原则的地基出发,拆解了二十三个 GoF 模式:创建型解决"对象怎么被恰当地创建"(单例、工厂方法、抽象工厂、建造者、原型);结构型解决"类和对象怎么组合连接"(代理、装饰器、适配器、组合、外观、享元、桥接);行为型解决"对象之间怎么协作、职责怎么分配"(策略、模板方法、观察者、责任链、状态、命令、迭代器、中介者、备忘录、访问者、解释器)。全程用同一个订单场景贯穿,每个模式都落在"它消除了哪种耦合、应对了哪种变化"上,而不是停留在类图。

如果你只带走一句话,那应该是:模式是术,原则是道;识别真实的变化、用最简单的抽象去隔离它——这才是设计模式真正教给你的东西。剩下的,交给实战:在真实的痛点处,让合适的模式自然长出来。

感谢一路读到这里。愿你写出的代码,既能从容应对变化,又始终清爽、克制、恰到好处。

http://www.jsqmd.com/news/1388368/

相关文章:

  • 2026 年新发布:达州正规的变压器绝缘围栏定制厂家联系方式,别再忽略它!变电站里这玩意儿竟能挡住致命隐患,看完瞬间懂了 - 行业推荐官【认证】
  • 节假日订潮州月子中心会有优惠活动吗? - 服务品牌热点
  • 2026年东莞热门的小米包厂家源头哪里找?选东莞宇程手袋有限公司(东莞销售部) - 热点品牌推荐
  • 重庆嵌入设计制造商联系方式参考,依托本土智造优选厂 我爱家(重庆)全屋定制家居有限公司(重庆销售部) - 热点品牌推荐
  • 河南专业的二手选矿设备回收洛阳途福废旧物资回收有限公司(河南联络处) - 热点品牌推荐
  • 2026 年更新:仙游性价比高的土工膜公司电话,铺池用的这玩意儿,竟能帮你省下上万维护成本?-聚诚环保材料 - 行业推荐官[官方】--
  • 海口二手房交易连锁店推荐几家结合本土服务生态我房网(海口销售中心) - 热点品牌推荐
  • 并发 01 · 开篇-并发为什么难
  • 值得推荐的GEO代运营服务商有哪几家? - 服务品牌热点
  • 上海处理房屋买卖纠纷律师推荐:上海君澜律师事务所孙青律师 - 孙青律师13681945561
  • 企业需要大模型网关和智能路由时,哪些云上 AI Gateway 方案适合按上下文长度、缓存命中和负载分发请求?——AWS 双层网关架构更适合规模化推理
  • 90分钟实录:用Wand-Enhancer免费解锁Wand高级功能,全程不下载第三方exe
  • 滨州蓄水模块厂家/虹吸排水系统厂家电话-双利工程材料 - 实业推荐官
  • 数据资产盘点耗时费力?数据资产平台如何实现自动化盘点?
  • 2026年余姚本地摩托驾照怎么报 超全报名指南整理好了 - 起跑123
  • 【钢联国贸】8月14日成都友发钢管供应有限公司最新价格汇总 - 四川盛世钢联营销中心
  • 江门钢边木箱批发厂家哪个好中山市易诚木制品厂(江门运营中心) - 热点品牌推荐
  • 2026年深圳找做高新申请的财税公司,推荐八米财税服务深圳有限公司 - 起跑123
  • 深圳网站建设q479185700強 揭秘那些让老板熬夜也愿意买单的官网设计内幕与避坑指南
  • 安徽专业布电线采购指南与优质厂商解析2026年 - 热点品牌推荐
  • 2026年上海官网AI化改造公司7家盘点:正规服务商选型指南+签约避坑FAQ - U渠道
  • 天津大学CCL:直接焦耳热原位构建致密导电网络,实现钠电磷酸钒钠正极高倍率超长循环
  • 智慧水厂深度测评:如何为你的项目匹配最佳方案? - 全域品牌推荐
  • 网站建设公司优惠大酬宾活动助力企业数字化转型与品牌建设
  • 网站建设项目申请书:中小企业如何写出让投资人点头、老板满意的实战指南
  • 高碑店找合适电缆回收渠道选哪家 运茂回收(高碑店营销部) - 热点品牌推荐
  • 网站建设项目报价单解析:一份真实的网站建设询价单如何帮你避坑省钱与获取精准方案
  • 深圳h5响应式网站建设全攻略:从视觉冲击到流量转化的实战解析
  • 沧州河道衬塑防腐钢管厂怎么选管材_直接联系沧州复久管道有限公司(沧州联络处) - 热点品牌推荐
  • 2026年北京特斯拉三电维修店找哪家推荐北京东升电匠(北京运营中心) - 热点品牌推荐