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

Java 设计模式——分类及功能:从理论分类到实战场景映射

Java 设计模式——分类及功能:从理论分类到实战场景映射

设计模式的分类不是 “纸上谈兵的划分”,而是帮你快速定位 “解决问题的工具”—— 当你遇到 “如何灵活创建对象”“如何解耦复杂模块”“如何协调对象协作” 等问题时,能通过分类快速找到对应模式。本文不仅拆解分类逻辑,更会结合Java 实战场景,让你知道 “每种分类下的模式到底能解决什么项目问题”。

文章目录

  • Java 设计模式——分类及功能:从理论分类到实战场景映射
    • 一、按目的分类:解决 “做什么” 的问题
      • 1. 创建型模式:解决 “对象创建” 的灵活性问题
      • 2. 结构型模式:解决 “模块 / 对象组合” 的扩展性问题
      • 3. 行为型模式:解决 “对象协作” 的解耦问题
    • 二、按作用范围分类:解决 “静态 / 动态” 的适用场景问题
      • 1. 类模式:静态关联,编译时确定关系
      • 2. 对象模式:动态关联,运行时可调整

一、按目的分类:解决 “做什么” 的问题

这是最常用的分类方式,核心是根据模式的 “核心目标” 划分,直接对应项目开发中的三大核心需求:创建对象、组织结构、协调行为。

1. 创建型模式:解决 “对象创建” 的灵活性问题

核心特点:将 “对象创建” 与 “对象使用” 彻底分离,避免硬编码 new 对象导致的耦合,让创建逻辑可配置、可扩展。

项目痛点场景:如果在代码里到处写new UserService(),后续需要给UserService加构造参数、或切换为代理对象时,要改所有代码 —— 创建型模式就是解决这类问题。

包含模式及实战价值

  • 单例模式:Spring 中 Bean 默认单例的实现,避免频繁创建对象浪费资源(如配置类、工具类);
  • 原型模式:快速克隆复杂对象(如订单对象复制,避免重复 set 几十上百个属性);
  • 工厂方法模式:动态创建不同类型的产品(如根据支付类型,创建微信 / 支付宝支付实例);
  • 抽象工厂模式:创建 “产品族”(如创建 “Windows 系统 + MySQL 数据库” 的配套组件,或 “Linux 系统 + PostgreSQL” 的配套组件);
  • 建造者模式:分步构建复杂对象(如创建包含基础信息、商品列表、优惠规则的订单对象,按步骤组装)。

2. 结构型模式:解决 “模块 / 对象组合” 的扩展性问题

核心特点:通过特定的组合方式,将类或对象组装成更灵活的结构,应对需求变化时的 “最小改动”。

项目痛点场景:如果直接在 Controller 里写支付逻辑、日志逻辑、鉴权逻辑,代码会臃肿且难以修改 —— 结构型模式帮你 “拆分 + 组合” 这些模块。

包含模式及实战价值

  • 代理模式:Spring AOP 的底层核心,在不修改原代码的情况下增强功能(如日志记录、事务控制);

  • 适配器模式:统一第三方接口差异(如对接微信支付 V2、支付宝 V3 接口,用适配器封装成统一的支付接口);

  • 桥接模式:分离 “抽象逻辑” 与 “具体实现”(如消息发送功能,抽象层定义 “发送” 逻辑,实现层分别对接短信、邮件、推送);

  • 装饰模式:动态给对象加功能(如给基础的文件上传功能,装饰 “权限校验”“文件压缩”“进度监控” 功能);

  • 外观模式:给复杂子系统提供统一入口(如订单创建需要调用库存、支付、物流系统,用外观类封装成createOrder()一个方法);

  • 享元模式:复用大量相似对象(如系统中频繁创建的 “商品分类标签”,用享元池缓存,避免重复创建);

  • 组合模式:处理 “树形结构” 数据(如菜单管理,用组合模式统一处理单个菜单和菜单组的查询、删除)。

3. 行为型模式:解决 “对象协作” 的解耦问题

核心特点:定义对象间的交互规则,明确 “谁负责做什么”,避免对象间的直接依赖导致的代码混乱。

项目痛点场景:如果订单支付成功后,需要同步更新库存、发送通知、记录日志,直接在支付方法里调用这些逻辑,会导致耦合过高 —— 行为型模式帮你 “解耦协作关系”。

包含模式及实战价值

  • 模板方法模式:定义算法骨架(如导出 Excel 的流程:“查询数据→处理数据→写入 Excel→下载”,子类只需要实现 “查询数据” 步骤);
  • 策略模式:替换不同算法(如订单优惠计算,按 “满减”“折扣”“优惠券” 等策略动态切换计算逻辑);
  • 命令模式:封装请求(如订单的 “创建”“取消”“退款” 操作,封装成命令对象,支持撤销、日志记录);
  • 职责链模式:链式处理请求(如接口鉴权:“token 校验→权限校验→参数校验”,每个步骤是一个责任节点,依次处理);
  • 状态模式:根据对象状态动态改行为(如订单状态:“待支付→已支付→已发货→已完成”,不同状态下调用 “取消” 方法的逻辑不同);
  • 观察者模式:Spring 事件机制的核心,实现 “一对多” 通知(如支付成功后,通知库存系统、通知消息系统、通知统计系统);
  • 中介者模式:统一管理对象交互(如电商系统中,商品、订单、库存、用户的交互,用中介者类统一协调,避免相互依赖);
  • 迭代器模式:统一遍历集合(如自定义的 “商品列表” 集合,用迭代器封装遍历逻辑,支持正向、反向遍历);
  • 访问者模式:灵活扩展对象的访问方式(如商品数据的 “统计金额”“导出报表”“筛选库存不足” 操作,用访问者模式新增功能);
  • 备忘录模式:保存 / 恢复对象状态(如编辑器的 “撤销” 功能,保存文档的历史状态,支持回滚);
  • 解释器模式:解析特定语法(如自定义的 “优惠规则表达式”:“满 100 减 20 且包含会员商品”,用解释器解析并执行)。

二、按作用范围分类:解决 “静态 / 动态” 的适用场景问题

该分类聚焦模式的 “作用维度”—— 是基于类的继承(静态),还是基于对象的组合(动态),帮你判断模式的 “灵活度”。

1. 类模式:静态关联,编译时确定关系

核心特点:依赖类的继承关系,结构在编译时就固定,灵活性较低,但逻辑简单直接。

适用场景:需求稳定、不需要频繁修改的场景(如基础组件的固定流程)。

包含模式:工厂方法模式、(类)适配器模式、模板方法模式、解释器模式。

实战示例:用模板方法模式定义 “导出数据” 的固定流程(父类定义骨架,子类继承实现具体查询),编译时就确定了父类与子类的关系,后续不会频繁改动流程。

2. 对象模式:动态关联,运行时可调整

核心特点:依赖对象的组合 / 聚合关系,结构在运行时可动态变化,灵活性高,是项目中更常用的类型。​

适用场景:需求多变、需要灵活扩展的场景(如业务逻辑的动态切换)。​

包含模式:除上述 4 种类模式外,其余 19 种设计模式均属于对象模式。​

实战示例:用策略模式实现 “优惠计算”,运行时根据用户选择的优惠类型(满减 / 折扣),动态切换对应的策略对象,无需修改原有代码。


文章转载自:

http://I8Bdu3jT.hrnrx.cn
http://jBHsU2WD.hrnrx.cn
http://6JYI4Id1.hrnrx.cn
http://cMBRVgiQ.hrnrx.cn
http://ndnf3g1b.hrnrx.cn
http://Xz8NSoha.hrnrx.cn
http://SMcQlId6.hrnrx.cn
http://qLV0Kq49.hrnrx.cn
http://Er0RxB4P.hrnrx.cn
http://VKPPYUvl.hrnrx.cn
http://i6CLjeio.hrnrx.cn
http://prZzpvYt.hrnrx.cn
http://EcJ7YVn1.hrnrx.cn
http://YzshSHtx.hrnrx.cn
http://F1EWCGGU.hrnrx.cn
http://c352xdV7.hrnrx.cn
http://nNN8hZDR.hrnrx.cn
http://Z40kTE7m.hrnrx.cn
http://M0aj24xD.hrnrx.cn
http://V7pLcvEj.hrnrx.cn
http://KshDObkf.hrnrx.cn
http://DkUtUCSa.hrnrx.cn
http://CbORDAz4.hrnrx.cn
http://9hXKD1XI.hrnrx.cn
http://gRmdUU1C.hrnrx.cn
http://NlR4AGZL.hrnrx.cn
http://HTItwKXo.hrnrx.cn
http://s4IgCIuZ.hrnrx.cn
http://nRDoeqkD.hrnrx.cn
http://6DNzTPC8.hrnrx.cn
http://www.dtcms.com/a/384791.html

相关文章:

  • 【LangChain指南】输出解析器(Output parsers)
  • 答题卡识别改分项目
  • 【C语言】第七课 字符串与危险函数​​
  • Java 网络编程全解析
  • GD32VW553-IOT V2开发版【三分钟快速环境搭建教程 VSCode】
  • Docker 与 VSCode 远程容器连接问题深度排查与解决指南
  • 流程图用什么工具做?免费/付费工具对比,附在线制作与下载教程
  • IT运维管理与服务优化
  • javaweb XML DOM4J
  • 用C#生成带特定字节的数据序列(地址从0x0001A000到0x0001C000,步长0x20)
  • 解析预训练:BERT到Qwen的技术演进与应用实践
  • PCB 温度可靠性验证:从行业标准到实测数据
  • 机器人要增加力矩要有那些条件和增加什么
  • MongoDB 在物联网(IoT)中的应用:海量时序数据处理方案
  • 6U VPX 板卡设计原理图:616-基于6U VPX XCVU9P+XCZU7EV的双FMC信号处理板卡
  • 【芯片设计-信号完整性 SI 学习 1.2.2 -- 时序裕量(Margin)】
  • Elasticsearch核心概念与Java实战:从入门到精通
  • Flink 内部状态管理:PriorityQueueSet解析
  • ChatBot、Copilot、Agent啥区别
  • LeetCode 热题560.和为k的子数组 (前缀和)
  • 掌握多边形细分建模核心技术:从基础操作到实战技巧详解
  • [特殊字符] Python在CentOS系统执行深度指南
  • 机器人控制器开发(定位——cartographer ros2 使用1)
  • 7 制作自己的遥感机器学习数据集
  • FPGA 40 DAC线缆和光模块带光纤实现40G UDP差异
  • 强化学习【value iterration】【python]
  • 代码随想录算法训练营第四十天|01背包 二维 01背包 一维 416.分割等和子集
  • 力扣:1547. 切棍子的最小成本
  • LeetCode 2962.统计最大元素出现至少K次的子数组
  • ESP8266无法连接Jio路由器分析