cd ..
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...