详细介绍:在不同开发语言与场景下设计模式的使用

news/2025/10/26 11:43:26/文章来源:https://www.cnblogs.com/yxysuanfa/p/19166624

在不同制作语言与场景下设计模式的使用

作为一名在不同技术栈中摸爬滚打多年的码农,种过瓜得过瓜,也种过瓜得过豆,得出了一些种菜的心得,我很乐意分享我对设计模式的理解给大家。

设计模式不是什么“银弹”,更不是为了炫技而存在的“八股文”。
它们是前人智慧的结晶,是在无数次代码重构的阵痛中总结出的通用沟通语言和最佳实践。但有时设计模式又变得成了为模式而模式。

本文将带你穿越不同语言的语法花丛,从一个务实的视角,去审视那些最常用的设计模式,并探讨如何在工程实践中权衡和应用它们。


开篇:为什么我们还在谈论“老掉牙”的设计模式?

在敏捷开发和“高效迭代”成为主流的今天,我们为什么还要学习这些看似“重型”的理论?

答案很便捷:为了对抗软件的无序熵增

代码的腐烂,往往不是因为某个算法不够高效,而是因为模块间的依赖混乱、职责不清,最终形成一个谁也不敢动的“大泥球”(Big Ball of Mud)。最近在重构一个系统,这个架构还不算太老,但是不打开断点,甚至摸不清其逻辑是如何往下走的。

设计模式,就是我们对抗这种混乱的“内功心法”。它教会我们如何解耦、如何封装、如何定义清晰的边界,让我们的代码在时间的冲刷下,依然保持优雅和健壮。

一:常用设计模式速览——我们的“兵器谱”

在深入对比之前,我们先迅速认识一下今天出场的几位“武林高手”。

  • 创建型模式 (Creational Patterns): 关注如何“优雅地”创建对象。

    • 工厂方法 (Factory Method): 定义一个创建对象的接口,但让子类决定实例化哪个类。就像一个“手机代工厂”,具体生产小米还是华为,由下单的品牌方(子类)决定。

    • 构建器 (Builder): 将一个复杂对象的构建过程与其表示分离。想象一下在路边麻辣烫点餐,你许可一步步选择水果、肉、蔬菜、汤料,最后拿到一碗定制好的麻辣烫。

    • 单例 (Singleton): 确保一个类只有一个实例,并提供一个全局访问点。就像一个国家的主席,永远只能有一个。

  • 结构型模式 (Structural Patterns): 关注如何将类和对象组合成更大的结构。

    • 适配器 (Adapter): 将一个类的接口转换成客户希望的另一个接口。最经典的例子就是电源适配器,把墙上的三孔插座转换成你的两孔充电器能用的形式。

    • 装饰器 (Decorator): 动态地给一个对象添加一些额外的职责。就像给你的手机套上手机壳,既保护了手机(增加机制),又没改变手机本身。

    • 外观 (Facade): 为子系统中的一组接口提供一个统一的高层接口。就像医院的“导诊台”,你只需要告诉它你的症状,它会帮你处理挂号、分诊等一系列复杂流程。

  • 行为型模式 (Behavioral Patterns): 关注对象之间的职责分配和通信。

    • 策略 (Strategy): 定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。例如,地图App里的出行策略:你可以选择“驾车”、“公交”或“步行”,App会根据你的选择切换不同的路线规划算法。

    • 观察者 (Observer): 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。就像你订阅了B站的UP主,他一更新视频,你就会收到通知。

二:跨语言差异——设计模式在三大技术栈中的“变形记”

本文的核心。同一个设计模式,在不同语言的“水土”中,会生长出截然不同的形态。就是这

设计模式 (Pattern)Java (严谨的学院派)Vue + TypeScript (务实的乐高玩家)Python (灵活的动态侠)
工厂方法场景: Spring框架中的BeanFactory、JDBC的DriverManager。在需要根据不同参数创建不同子类实现的场景下非常普遍。 好处: 完美解耦。客户端代码只依赖于抽象接口,不关心具体搭建,符合“开闭原则”。场景: 创建复杂的、可配置的UI组件。例如一个createDialog(type, options)函数,根据type(‘confirm’, ‘alert’)返回不同配置的对话框组件实例。 好处: 封装组件创建逻辑,简化在视图中的采用,提高组件复用性。场景: 当你需要根据配置或用户输入动态创建不同类的实例时。例如,一个数据导出工具,根据format参数(‘csv’, ‘json’)返回不同的Exporter子类。 好处: 代码更灵活,易于扩展。在Python中通常用一个简单的函数或字典映射实现,比Java轻量。
构建器场景: 当一个对象有大量可选参数时,如构建复杂的HttpRequest或数据库Query对象。Lombok的@Builder注解是其最佳实践。 好处: 告别冗长的构造函数安全的。就是,链式调用让代码可读性极高,且对象在构建完成前状态场景: 比较少见,因为组件的props本身就扮演了类似的角色。但在构建复杂的、非UI的数据结构(如API请求体)时依然有用。 好处: 提高复杂对象部署的可读性和安全性。场景: 同样用于构建繁琐对象,但Python的**关键字参数(kwargs)在很多场景下许可更简洁地替代它。只有当构建过程有严格的步骤和依赖关系时,才会使用正式的Builder模式。 好处: 提高代码可读性,但需警惕过度设计。
单例场景: 配置文件管理器、线程池、日志对象等需要全局唯一的组件。在Spring中,所有Bean默认都是单例的。 好处: 节约系统资源,保证全局状态的一致性。 注意: 容易成为全局状态的“万恶之源”,增加测试难度。场景: 全局状态管理(如Pinia/Vuex Store)、API服务实例(如axios实例)。通常利用ES6模块的导出机制天然实现。 好处: 提供全局共享的数据或服务,且在模块系统中构建非常简单自然。场景: 数据库连接池、应用调整对象。Python的模块本身就是天然的单例,第一次导入时会执行,后续导入直接使用缓存。这是最Pythonic的实现方式。 好处: 实现简单,符合语言特性。
适配器场景: 集成第三方SDK、兼容旧版接口。例如,将一个旧的List接口适配成新的StreamAPI。 好处: 复用现有代码,隔离变化,让不兼容的接口协同工作。场景: API数据格式转换。后端返回的数据结构往往不直接适用于前端组件,需要一个适配器将其转换为组件props所需的格式。 好处: 前后端解耦。后端接口变更时,只需修改适配器,无需改动整个组件。场景: 封装不同数据库的驱动、调用不同云厂商的API。Python的“鸭子类型”使其在很多时候不需要显式的接口适配,但当接口差异巨大时,适配器模式依然是最佳选择。 好处: 隔离外部依赖,让代码更具移植性。
装饰器场景: Java的I/O类,如BufferedReader包装FileReader。在不修改原有类的基础上,为其添加缓存、日志、权限校验等功能。 好处: 符合“开闭原则”,比继承更灵活,可以动态组合功能。场景: 高阶组件(HOC)或Vue 3的组合式函数(Composition API)。例如,创建一个withAuth函数,包装一个业务组件,为其自动添加权限校验逻辑。 好处: 逻辑复用,让组件保持纯粹,专注于视图渲染。场景: 语言级支持。Python的@语法糖就是装饰器模式的最佳体现。@login_required@cache@log_execution_time等是其经典应用。 好处: 代码优雅、简洁,极大地增强了语言的表达能力。
外观场景: 提供一个简化的API来封装一个复杂的子系统。例如,一个VideoConverter外观类,内部封装了视频解码、编码、音频处理等多个复杂模块。 好处: 简化客户端使用,降低耦合度。场景: 封装一组与特定业务相关的API调用。例如一个UserProfileFacade,封装了获取用户基本信息、获取用户订单、获取用户动态等多个API请求。 好处: 简化视图逻辑,让组件调用更简单,也便于统一处理加载和错误状态。场景: 与Java类似,用于简化复杂库(如boto3操作AWS)的调用。创建一个简单的外观类,提供几个高频使用的方法,隐藏内部复杂的配置和调用链。 好处: 降低学习成本,提高开发效率。
策略场景: 定义不同的排序算法、支付方式(支付宝/微信/银联)、压缩算法等。客户端可以根据需要动态切换。 好处: 算法独立,易于扩展和测试,避免了大量的if-else场景: 表单校验规则、不同的图表渲染策略、动画效果。例如,一个输入框能够根据需要动态应用“必填”、“邮箱格式”、“手机号格式”等不同的校验策略。 好处: 逻辑清晰,易于动态组合和复用。场景: Python中函数是一等公民**,这使得策略模式的搭建非常轻量。可以直接将函数作为参数传递,很多时候不必须创建一堆策略类。好处: 极其灵活和简洁,非常符合Python的哲学。
观察者场景: AWT/Swing的事件监听、消息队列(MQ)的发布订阅。一个典型的事件驱动模型。好处: 实现发布者和订阅者的解耦,两者可以独立变化。场景: Vue的响应式系统就是观察者模式的终极体现。当你在dataref中修改一个值时,所有依赖该值的组件(观察者)都会自动收到通知并重新渲染。 好处: 数据驱动视图,是现代前端框架的基石。场景: GUI编程、事件驱动平台、信号处理。例如,Web框架(如Django)中的信号(Signals)机制。好处: 达成松耦合的事件通知机制

三:重要的“设计模式过滤器”——务实主义者的拷问

好的工程文化应该务实、简洁、可维护。

过去我有一个同事,总喜欢炫技,但是这好比闪电五连鞭,可是我们此刻只得一个直拳,你懂吗?

工程师在决定是否使用一个设计模式时,我们需要一些“过滤器”来拷问自己的设计。

1. 可读性 > 聪明 (Readability > Cleverness)

  • 拷问: “一个新来的应届生能看懂这段代码吗?还是他需要先去读完《设计模式》这本书?”

  • 实践: 好代码可读性规范是极其严格的。如果一个简单的if-else比一个复杂的策略模式更清晰易懂,那么就选择if-else代码首先是写给人看的,其次才是给机器执行的典型的反模式。就是。过度使用设计模式,用“大炮打蚊子”,

2. 轻松性与YAGNI原则 (Simplicity & You Ain’t Gonna Need It)

  • 拷问: “我是为了解决一个当前存在的难题,还是为了一个未来可能会出现的扩展点在应用该模式?”

  • 实践: 不要为了模式而模式。谷歌内部流传着“Rule of Three”的说法:当你第一次写某段逻辑时,直接写;第二次遇到相似逻辑时,复制粘贴也没关系;直到第三次遇到,才需要去抽象和重构,此时设计模式才真正派上用场。这能够有效避免过度工程化。

3. 可测试性是“一等公民” (Testability is a First-Class Citizen)

  • 拷问: “我引入的该模式,是让单元测试变得更容易了,还是更困难了?”

  • 实践通过: 这是一个非常硬的指标。例如,传统的单例模式因为引入了全局状态,会给单元测试带来巨大的麻烦。因此,我们是否该使用**依赖注入(Dependency Injection)**来管理单例对象,由框架(如Guice)来保证其生命周期,这样在测试时就能够轻松地替换成Mock对象。

4. 权衡与文档化 (Trade-offs & Documentation)

  • 拷问否在注释或设计文档里说清楚了?”就是: “我选择这个模式,牺牲了什么(比如性能、复杂度)?得到了什么(比如扩展性、解耦)?这个权衡值得吗?我

  • 实践: 没有任何设计是完美的。例如,装饰器模式虽然灵活,但会产生大量的小类;观察者模式解耦了双方,但也可能让调用链变得不那么直观。在谷歌的设计文档(Design Doc)文化中,清晰地阐述你做出的权衡,是方案能否借助评审的关键

成为工具的主人,而非模式的奴隶

一张藏宝图,它指向了更优雅、更健壮的代码。就是设计模式

你在寻宝过程中,学会的就是但真正的宝藏,并非图上标记的那种“X”,而如何观察地形、如何选择路径、如何应对变化的能力

作为一名种地多年的码农,我最大的感悟是:最好的设计,往往是“恰到好处”的设计

它可能没有用到任何一个高深的设计模式,但它的每一行代码都清晰、直接、易于理解和修改。

希望这篇文章能帮助你更好地驾驭这些强大的程序,在日常的编写中,写出既能“降伏需求猛兽”,又能“穿越时间风雨”的优秀代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/946685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手势检测(充满科技感) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 10 月商用厨房设备,酒店厨房设备,大型厨房设备厂家最新推荐,聚焦高端定制需求与全案交付能力

商用、酒店及大型厨房设备需适配多元化场景需求(如酒店宴会厨房、连锁餐饮中央厨房、大型企业食堂),高端定制能力与全案交付水平直接决定厨房运营效率与体验。据中国旅游饭店业协会 2025 年 10 月发布的《酒店厨房设…

zr模拟赛day8T2

正变换无法确定朝大还是朝小变换 考虑逆变换,因为逆变换只能是大减小 发现变成了辗转相减的形式 考虑优化成辗转相除 发现可以记录辗转相除中的每个关键点 记录成一个三元组 然后就发现可以二分查询了 有一个小细节是…

实用指南:Android 常见界面布局详解

实用指南:Android 常见界面布局详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

251026

目录JT-JY10T4S1-1JT-JY10T4S1-2 JT-JY10T4S1-1ThDks, good morning, is that Mr.ThDk? Speaking, how can i help? I have got quite few things which need painting and fixing in the flat, and i wonder whethe…

2025 年 10 月食堂厨房设备厂家最新推荐,聚焦资质、案例、售后的食堂场景深度解读

食堂厨房设备直接关系到师生、职工的饮食安全与就餐效率,其资质合规性、食堂场景适配性与售后保障能力尤为关键。据中国教育后勤协会 2025 年 10 月发布的《校园食堂设备质量报告》显示,26% 的食堂设备因资质不全存在…

Android下加载libUnreal.so文件

Android下加载libUnreal.so文件Android 下动态加载so库 具体有两种方式: (1)调用 load(String filename) 方法System.load("/data/data/com.example.mygame/files/libUnreal.so"); // 传递进去的是全路径…

2025 年 10 月不锈钢厨房设备厂家最新推荐,产能、专利、环保三维数据透视

不锈钢厨房设备凭借耐用、易清洁的特性,成为餐饮、酒店、食堂等场景的核心选择,但其产能稳定性、技术专利储备与环保合规性,直接影响采购方的供应保障与长期运营成本。据中国五金制品协会不锈钢制品分会 2025 年 10…

DINO版本进化

1.蒸馏 KD 与 自蒸馏 SD普通蒸馏,是有监督(软标签),老师是外部预训练的大模型自蒸馏,无监督,老师是 自己的历史版本EMA2.EMA机制有一个问题,如果学生和老师输出的内容是一致的,那学生什么也学不到。所以老师网…

2025 年 10 月餐饮厨房设备厂家最新推荐,实力品牌深度解析采购无忧之选!

餐饮厨房设备作为餐饮企业运营的核心基础设施,其质量与服务直接关系到食品安全、运营效率及成本控制。据中国烹饪协会 2025 年 10 月发布的《餐饮行业设备采购白皮书》显示,近一年餐饮企业因设备质量问题产生的额外支…

sometime some time sometimes

sometime is an unspecified point in timesome time is a period/span of timesometimes is an adverb about frequency英语国家也有自己的 的地得

基于深度学习神经网络协同过滤模型(NCF)的视频推荐体系

基于深度学习神经网络协同过滤模型(NCF)的视频推荐体系pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

关于容斥原理

简单的不说了,直接开题。 P1450 [HAOI2008] 硬币购物 题意 有 \(c1, c2, c3, c4\) 四种面值的硬币,询问多次,给你每个硬币最多有多少个,问凑出 \(S\) 面值的方案。 分析 考虑一个 \(f_i\) 是 i 号硬币不满足条件的…

可变字符串

可变字符串StringBuffer:可变长字符串,运行效率慢,线程安全StringBuilder:可变长字符串,运行效率吧快,线程不安全 package String; /*** StringBuffer和StrinBulider的使用* 和String的区别(1)比String效率高(…

给安卓设置背景色的时候保持默认按钮样式(关于使用setBackgroundColor导致丢失默认按钮样式的问题)

给安卓设置背景色的时候保持默认按钮样式(关于使用setBackgroundColor导致丢失默认按钮样式的问题)核心apiButton.setBackgroundTintList(ColorStateList);void initPatterns(LinearLayout PatternsRoot){for(int i=0;…

分片上传与断点续传实现详解

分片上传与断点续传实现详解 在现代Web应用中,用户经常需要上传大文件,如视频、压缩包等。传统的文件上传方式在面对大文件时容易出现超时、失败等问题,而且一旦上传中断就需要重新上传整个文件,浪费时间和带宽。为…

欧拉定理

欧拉定理 给定整数 \(a,m\),其中 \(\gcd(a,m)=1\),求证: \[a^{\phi(m)} \equiv 1 \pmod m \]其中 \(\phi(m)\) 是欧拉函数,表示 \(\le m\) 中与 \(m\) 互质的数的个数。 欧拉定理证明 考虑模 \(m\) 的一个简化剩余…

Kanass入门到实战(6) - 如何进行缺陷管理 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

手把手在 Linux 上安装 Docker 与 Docker Compose(包含 Ubuntu、CentOS 等 11 个发行版)

从零开始:按命令实操在 11 个主流 Linux 发行版(含 Ubuntu、CentOS、Debian 等)上安装 Docker 与 Docker Compose。支持 11 种主流发行版:OpenCloudOS、Anolis OS (龙蜥)、Alinux (阿里云)、Fedora、Rocky Linux、…

2025 年 10 月展示柜厂家最新推荐,精准检测与稳定性能深度解析!

展示柜的稳定性能直接关系到零售商家的日常运营效率与商品陈列效果,为助力商家筛选出经过精准检测、性能可靠的展示柜厂家,2025 年 10 月,中国商业设施协会联合国家轻工业产品质量监督检测中心,开展展示柜行业专项…