设计模式在 JDK 中的具体应用与分析

embedded/2025/3/13 10:38:21/

在这里插入图片描述

一、设计模式

GOF 设计模式是面向对象设计中常见问题的可复用解决方案,通过 23 种经典模式 提供了一套标准化的设计思路,用于解决软件设计中反复出现的架构和交互问题。其核心特点包括:

  • 经验驱动:源于实际项目的经验总结,非理论推导。

  • 抽象化:以接口和组合替代硬编码依赖,提升灵活性。

  • 解耦:分离对象创建、结构组装和行为协作,降低耦合。

1.0、设计模式原则(SOLID)

  • 单一职责原则(Single Responsibility Principle)

    一个类应该只有一个发生变化的原因。

  • ‌开闭原则(Open-Closed Principle, OCP)‌

    软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着应该能够在不修改现有代码的情况下,让软件的行为发生变化(通常通过添加新代码来完成)。

  • 里氏替换原则(Liskov Substitution Principle)

    所有引用基类的地方必须能透明地使用其子类的对象。

  • 接口隔离原则(Interface Segregation Principle)

    1、每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。
    2、使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。

  • 依赖倒置原则(Dependence Inversion Principle)

    1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。
    2、抽象不应该依赖于细节,细节应该依赖于抽象。
    3、面向接口编程,依赖于抽象而不依赖于具体。

1.1、创建型模式(5 种)

目标: 解耦对象创建,提供灵活的对象实例化机制。

创建型模式JDK 应用示例实现方式与作用
单例模式java.lang.Runtime
java.awt.Desktop
饿汉式(静态初始化)或懒汉式(双重检查锁),确保全局唯一实例(如运行时环境管理)。
工厂模式java.util.Calendar#getInstance()
java.text.NumberFormat#getInstance()
通过静态方法隐藏对象创建细节,按参数返回不同子类实例(如日期格式化器)。
抽象工厂模式javax.xml.parsers.DocumentBuilderFactory定义接口创建一组相关对象(如 XML 解析器工厂生成 DocumentBuilder 和 SchemaFactory)。
建造者模式java.lang.StringBuilder
java.util.stream.Stream.Builder
分步构造复杂对象(如字符串拼接、流构建),避免构造函数参数爆炸。
原型模式java.lang.Cloneable 接口通过 clone() 方法复制对象(如 ArrayList 的浅拷贝),减少重复创建开销。

1.2、结构型模式(7 种)

目标: 组合对象或类,形成更大结构的灵活方案,不破坏原有结构。

结构型模式JDK 应用示例实现方式与作用
适配器模式java.util.Arrays#asList()
java.io.InputStreamReader
转换接口兼容性(如数组转列表、字节流转字符流),通过包装对象实现接口适配。
装饰器模式java.io.BufferedInputStream
java.util.Collections#unmodifiableList()
动态扩展功能(如缓冲读写、集合不可变化),通过嵌套包装对象叠加行为。
代理模式java.lang.reflect.Proxy动态代理控制访问(如 AOP 切面),拦截方法调用并增强逻辑(权限校验、日志等)。
外观模式java.net.URL(封装网络连接细节)简化复杂子系统调用(如 URL 统一处理协议、域名解析和流操作),日志框架SLF4J。
桥接模式JDBC 驱动接口与实现类(如 java.sql.Drivercom.mysql.jdbc.Driver分离抽象与实现(如数据库驱动适配不同厂商),通过接口与实现类独立扩展。
组合模式java.awt.Container#add(Component)
javax.swing.JTree
统一处理树形结构(如 GUI 组件嵌套),叶子节点与容器节点共享同一接口。
享元模式java.lang.Integer#valueOf()
java.util.Collections#emptyList()
共享细粒度对象(如缓存 -128~127 的 Integer、空集合),减少内存占用。

1.3、行为型模式(11 种)

目标: 优化对象间交互与职责分配,定义通信流程和算法协作。

行为型模式JDK 应用示例实现方式与作用
策略模式java.util.Comparator
java.util.Arrays#sort(T[], Comparator)
封装算法族(如排序规则),运行时动态切换策略(Comparator 定义不同排序逻辑)。
模板方法模式java.io.InputStream
read() 调用 read(byte[], int, int)
定义算法骨架(如 IO 读取流程),子类重写特定步骤(如 read() 实现具体读取逻辑)。
观察者模式java.util.Observable (JDK9已弃用)
java.util.Observer (JDK9已弃用)
java.beans.PropertyChangeSupport
订阅-通知机制(如事件监听),主题状态变化时自动通知观察者。
迭代器模式java.util.Iterator
java.util.Enumeration
统一遍历集合元素(如 ListSet),隐藏底层数据结构差异。
责任链模式java.util.logging.Logger
(日志级别过滤)
请求沿链传递(如日志处理器按级别过滤),每个节点决定处理或传递。
命令模式java.lang.Runnable
javax.swing.Action
封装请求为对象(如线程任务、GUI 操作),支持撤销、重做和队列管理。
备忘录模式java.io.Serializable
(序列化实现状态保存)
捕获对象内部状态(如对象持久化),支持回滚或恢复。
状态模式java.util.Iterator
ArrayList.ItrHashMap.EntryIterator
对象行为随状态改变(如迭代器在不同集合中的遍历逻辑),通过状态类分离条件分支。
访问者模式javax.lang.model.element.ElementVisitor
(注解处理器)
解耦数据结构与操作(如 AST 遍历),通过 Visitor 接口扩展新操作而不修改元素类。
中介者模式java.util.concurrent.Executor
(线程池任务调度)
集中管理对象交互(如线程任务分配),减少组件间直接依赖。
解释器模式java.util.regex.Pattern
(正则表达式解析)
定义语法规则(如正则匹配),通过解释器解析和执行表达式(JDK 中较少直接使用,更多见于框架或 DSL 场景)。

二、JDK 中设计模式的应用特点

  1. 性能优先

    • 享元模式Integer 缓存)、原型模式(Cloneable)减少对象创建开销。
    • 单例模式Runtime)避免重复初始化核心资源。
  2. 接口与实现解耦

    • 工厂模式(Calendar)、桥接模式(JDBC)隐藏底层实现细节,支持扩展。
    • 代理模式(动态代理)分离调用逻辑与具体实现。
  3. 功能动态扩展

    • 装饰器模式(IO 流嵌套)通过组合而非继承增强功能。
    • 策略模式(Comparator)运行时切换算法逻辑。
  4. 行为标准化

    • 迭代器模式(Iterator)统一集合遍历接口。
    • 模板方法模式(InputStream)固定流程框架,子类定制细节。

三、典型场景与源码分析

案例 1:装饰器模式(BufferedInputStream

java">// 基础组件:FileInputStream
InputStream raw = new FileInputStream("xiaolingting.txt");
// 装饰器:添加缓冲功能
InputStream buffered = new BufferedInputStream(raw);
// 再次装饰:添加解压功能(假设 GZIPInputStream 是另一装饰器)
InputStream gzip = new GZIPInputStream(buffered);
  • 作用:逐层包装,动态叠加缓冲、解压等功能,避免继承导致的类爆炸。

案例 2:策略模式(Arrays.sort()

java">Arrays.sort(users, (u1, u2) -> u1.getAge() - u2.getAge()); // 自定义 Comparator
  • 作用:将排序算法(如年龄比较)封装为策略对象,灵活替换不同比较逻辑。

案例 3:责任链模式(日志处理)

java">Logger logger = Logger.getLogger(Xiaolingting.Class);
logger.setLevel(Level.WARNING);
// 日志信息级别低于 WARNING 时,责任链中的处理器将忽略该消息
logger.log(Level.INFO, "This message will be filtered");
  • 作用:日志消息依次经过各级处理器(如控制台输出、文件记录),根据级别决定是否处理。

四、总结

JDK 广泛运用设计模式解决代码复用、扩展性和结构优化问题:

  • 高频模式:工厂、单例、装饰器、适配器、迭代器等,注重接口抽象与功能扩展。
  • 低频模式:解释器、访问者等,更多用于特定领域(如编译器、复杂业务规则)。

http://www.ppmy.cn/embedded/172216.html

相关文章

目录《Vue 3 + TypeScript + DeepSeek 全栈开发实战》

在快速迭代的软件开发世界里,技术的融合与创新始终是推动行业前行的不竭动力。今天,我们站在了前端技术与大数据搜索技术交汇的十字路口,手中的工具不再仅仅是编码的利器,更是解锁未来应用无限可能的钥匙。正是基于这样的时代背景…

【踩坑记录】MAC M4 mini 系统初始化

① 一定要准备好一个usb拓展坞,否则连不上键鼠! ② 初始化时,跳过mac账号登录,进入系统后再登录快一百倍! ③ 安装nvm,遇到报错:xcode-select: note: install requested for command line dev…

从信息一体到智能联动:辉视智慧学校广播系统全面提升校园管理效率

在智慧校园的建设中,高效、安全的沟通系统是保障教学秩序和校园安全的重要基石。辉视智慧学校广播对讲解决方案,以先进的IP网络和SIP协议为核心,不仅继承了传统广播系统的全部功能,更在此基础上进行了全面革新,为师生打…

Java 8 Stream 面试题

一、问题 Java 8 中的 Stream 用过吗?请介绍一下。 二、回答 1.概述 Stream 是 Java 8 中提供的对数据集合进行处理和运算的一套 API,能够非常方便地对数据集合进行处理。 Stream 的意思就是流,对于 Stream 的处理可以这样理解&#xff0c…

Python 数据可视化创意分享:解锁数据之

本文深入探讨 Python 在数据可视化领域的多种创意应用。通过介绍不同的可视化库以及实际案例,展示如何将枯燥的数据转化为富有洞察力且极具吸引力的图形,帮助读者拓宽数据可视化思路,提升数据分析与展示能力。 一、引言 在当今数据驱动的时…

玩转大数据:从零开始掌握SQL查询基础

玩转大数据:从零开始掌握SQL查询基础 大家好,我是Echo_Wish,一个热爱数据分析和大数据领域的自媒体创作者。今天我们来聊聊一个非常基础但又非常重要的话题——SQL查询的基础。对于任何希望在大数据领域有所作为的人来说,掌握SQL…

Redis超高并发分key实现

Redis扛并发的能力是非常强的,所以高并发场景下经常会使用Redis,但是Redis单分片的写入瓶颈在2w左右,读瓶颈在10w左右,如果在超高并发下即使是集群部署Redis,单分片的Redis也是有可能扛不住的,如下图所示&a…

java登神之阶之顺序表

一、了解List接口 在Java中,List接口是一个非常重要的集合框架接口,它继承自Collection接口(Collection接口继承Iterable接口)。List接口定义了一个有序集合,允许我们存储元素集合。并且可以根据元素的索引来访问集合中…