2025-12-1712 min54 views
这些设计模式你真的理解了吗?--常用的设计模式讲解
#Software Architecture#Creational Patterns#Structural Patterns#Behavioral Patterns#Design Patterns
AI Summary
每分钟最多 5 次
- 创建型模式:关注对象的创建过程,包括单例模式(保证一个类只有一个实例,并提供全局访问点)、工厂方法模式(定义一个创建对象的接口,让子类决定实例化哪一个类)和建造者模式(将复杂对象的构建与表示分离,通过链式调用来创建不同的表示)。这些模式有助于解耦对象的创建与使用。
- 结构型模式:侧重于类和对象的组合方式,如适配器模式(转换不兼容的接口)、装饰器模式(动态地给对象添加职责)和代理模式(为其他对象提供代理以控制其访问)。它们通过继承或代理来构建更大的结构,增强系统的灵活性和可扩展性。
- 行为型模式:处理对象之间的责任分配和通信算法,例如观察者模式(实现一对多依赖关系,当被观察者状态改变时通知所有观察者)、策略模式(封装一系列可互换的算法)以及模板方法模式(定义操作中的算法骨架,具体步骤由子类实现)。这些模式促进了代码的复用性和维护性。
- 设计模式的核心价值在于解决软件开发中常见的问题,提高代码质量和可维护性。但开发者应避免过度工程化,即不要为了应用模式而强行使用模式,尤其是在简单解决方案已经足够的情况下。
- 记忆口诀:单例保唯一,工厂产对象,建造分步骤;适配换接口,装饰加功能,代理控访问;观察联动的,策略换算法,模板定骨架。这有助于快速回忆起各种模式的关键用途。
设计模式(Design Patterns)是软件开发中针对常见问题的“标准答案”。它们不是具体的代码,而是经过验证的架构思想。
通常,设计模式分为三大类:创建型(对象怎么生)、结构型(类/对象怎么组装)、行为型(对象间怎么通信)。
以下是开发中最常用、面试最高频的几种模式,配合生活类比和技术场景进行具体讲解:
一、创建型模式 (Creational Patterns)
核心关注: 对象的创建过程,解耦对象的创建与使用。
1. 单例模式 (Singleton)
- 核心概念: 保证一个类只有一个实例,并提供一个全局访问点。
- 生活类比: 一个国家只能有一个总统;Windows 的任务管理器(不管你点开多少次,只弹出一个窗口)。
- 技术场景:
- 数据库连接池:避免频繁创建连接浪费资源。
- 配置文件读取器:全局配置只需加载一次。
- Spring Bean:Spring 容器中的 Bean 默认就是单例的。
2. 工厂方法模式 (Factory Method)
- 核心概念: 定义一个创建对象的接口,让子类决定实例化哪一个类。把“实例化”推迟到子类。
- 生活类比: 你去快餐店点餐,你只需要说“我要一个汉堡”,不需要知道厨房具体是先放生菜还是先放肉饼。
- 技术场景:
- 日志系统:你可以有
FileLogger,DatabaseLogger,ConsoleLogger,通过工厂根据配置产出具体的 Logger。 - 跨平台 UI:在 Windows 下创建
WindowsButton,在 Mac 下创建MacButton,但代码里统一调用createButton()。
3. 建造者模式 (Builder)
- 核心概念: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。链式调用是其典型特征。
- 生活类比: 赛百味(Subway)点餐。先选面包,再选肉,再选菜,最后选酱。步骤固定,但组合不同。
- 技术场景:
- SQL 查询构造器:
query.select("name").from("user").where("id = 1").build()。 - 复杂配置对象:如果一个类构造函数有10个参数(其中8个可选),用 Builder 模式比写一大堆
set方法更清晰。
二、结构型模式 (Structural Patterns)
核心关注: 类和对象的组合,通过继承或代理构建更大的结构。
1. 适配器模式 (Adapter)
- 核心概念: 将一个类的接口转换成客户希望的另一个接口,让原本不兼容的类可以合作。
- 生活类比: 出国旅游用的电源转换插头(把欧标插口转成国标插口)。
- 技术场景:
- 老系统改造:新系统需要调用一个老旧的接口,但参数格式不同,写一个 Adapter 包装老接口。
- 多支付渠道对接:微信支付和支付宝的 API 不同,可以定义一个统一的
PayAdapter接口,分别适配两者。
2. 装饰器模式 (Decorator)
- 核心概念: 动态地给一个对象添加一些额外的职责。比生成子类更灵活。
- 生活类比: 奶茶加料。一杯基础奶茶(原始对象),加珍珠(装饰1),加椰果(装饰2),最后还是那杯奶茶,但味道丰富了。
- 技术场景:
- Java I/O 流:
new BufferedReader(new FileReader("file.txt"))。BufferedReader装饰了FileReader,增加了缓冲功能。 - Web 请求增强:在处理 HTTP 请求前,给 Request 对象“装饰”上用户认证信息。
3. 代理模式 (Proxy)
- 核心概念: 为其他对象提供一种代理以控制对这个对象的访问。
- 生活类比: 明星的经纪人。你想找明星演戏(核心业务),必须先经过经纪人(代理),经纪人负责谈价钱、排期(前置处理),谈不拢直接拒绝,谈拢了再让明星出面。
- 技术场景:
- AOP(面向切面编程):Spring 中最经典的应用。在方法执行前自动开启事务,执行后自动提交事务(你写的业务代码不需要管事务)。
- 图片懒加载:网页先显示一个占位图(代理),滚轮滑到了再去下载真图(真实对象)。
三、行为型模式 (Behavioral Patterns)
核心关注: 对象之间的责任分配和通信算法。
1. 观察者模式 (Observer) - 非常重要
- 核心概念: 定义对象间的一对多依赖,当一个对象改变状态,所有依赖者都会收到通知并自动更新。
- 生活类比: 订报纸/关注公众号。公众号(被观察者)发新文章,所有粉丝(观察者)都会收到推送。
- 技术场景:
- 事件驱动架构:Vue/React 中的数据绑定。数据变了,视图自动更新。
- 消息队列:RabbitMQ/Kafka 的发布-订阅模型。
2. 策略模式 (Strategy)
- 核心概念: 定义一系列算法,把它们一个个封装起来,并且使它们可以互换。
- 生活类比: 回家的方式。你可以选:坐公交、打车、骑自行车。目标一样(回家),但在运行时根据有没有钱/赶不赶时间选择不同策略。
- 技术场景:
- 电商促销:根据用户等级计算价格。普通用户(无折扣策略)、VIP(打9折策略)、SVIP(打8折策略)。
- 排序算法:根据数据量大小,动态切换快速排序或归并排序。
3. 模板方法模式 (Template Method)
- 核心概念: 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。
- 生活类比: 泡茶和泡咖啡。步骤都是:1.烧水 -> 2.冲泡 -> 3.倒入杯中 -> 4.加料。步骤1、3是一样的(在父类实现),步骤2、4不同(子类重写)。
- 技术场景:
- 框架源码:Servlet 中的
doGet/doPost。Servlet 容器处理了 HTTP 请求的流程(接收、解析),具体的业务逻辑留给你的doGet方法去实现。
总结与建议
| 模式类型 | 记住这几个最核心的 | 一句话口诀 |
|---|---|---|
| 创建型 | 单例、工厂、建造者 | 单例保唯一,工厂产对象,建造分步骤。 |
| 结构型 | 适配器、装饰器、代理 | 适配换接口,装饰加功能,代理控访问。 |
| 行为型 | 观察者、策略、模板 | 观察联动的,策略换算法,模板定骨架。 |
避坑指南:
千万不要为了使用模式而使用模式(Over-engineering)。如果一个简单的 if-else 能清晰解决问题,就不要强行套用“策略模式”导致类爆炸。设计模式是用来解决复杂度的,不是用来制造复杂度的。
/** Comments(0)*/
Loading comments...