前言:
一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
引言
在上一篇文章中,我们系统地梳理了 Eclipse Paho Java Client 的源码结构、模块划分和基础使用方法。掌握了如何使用这个库,只是第一步。真正理解一个优秀的开源库,需要我们深入其设计思想,分析其架构决策背后的考量。
为什么仅仅了解使用还不够?
- 理解设计意图:通过源码分析设计模式和架构思想,可以帮助我们理解库为什么这样设计、好处是什么,从而更容易在自己项目中借鉴和优化。
- 提升工程能力:深入源码分析不仅能让我们更好地使用开源库,更能提升我们的架构设计能力和代码质量。
- 解决复杂问题:当遇到复杂场景或性能问题时,理解源码设计可以帮助我们找到最优解决方案。
- 技术深度:在技术面试或技术分享中,能够深入分析源码设计,体现了扎实的技术功底。
本文将从以下几个维度深入分析 Paho Java Client 的设计思想:
- 同步 vs 异步:如何通过适配器模式实现两套 API 的统一
- 模块划分:清晰的分层架构如何提高可维护性
- 协议版本兼容:如何优雅地支持 MQTT v3 和 v5
- 可扩展性:SPI 机制如何实现插件化架构
- 连接管理:状态机设计如何保证连接可靠性
- 资源管理:持久化机制如何保证消息可靠性
- 回调机制:观察者模式如何实现事件驱动
通过深入源码,我们将看到这些设计模式如何在实际项目中发挥作用,以及它们带来的实际价值。
1. 同步 API 和异步 API 的设计桥梁 —— Wrapper / 适配 / 桥接思想
1.1 设计背景:为什么需要两套 API?
在 MQTT 客户端库的设计中,一个核心问题是:如何同时满足不同场景的需求?
- 简单脚本场景:开发者希望代码简单直观,顺序执行,易于理解
- 高并发场景:需要非阻塞操作,不能因为等待网络响应而阻塞线程
- IoT 设备场景:资源受限,需要高效的异步处理
如果只提供同步 API,会阻塞线程,不适合高并发场景;如果只提供异步 API,对于简单场景又显得过于复杂。
Paho 的解决方案:提供两套 API,通过适配器模式实现代码复用,同步 API 是对异步 API 的包装。
1.2 源码实现:MqttClient 如何包装 MqttAsyncClient
让我们深入源码,看看这个设计是如何实现的:
1.2.1 类结构设计
设计亮点:
MqttClient不直接实现业务逻辑,而是通过委托给MqttAsyncClient来实现
- 所有同步操作都通过调用异步方法并等待完成来实现
- 这是适配器模式的典型应用:将异步接口适配为同步接口
1.2.2 核心方法:connect 的实现
让我们看看
connect 方法是如何将异步转为同步的:执行流程:
aClient.connect()立即返回一个IMqttToken(不阻塞)
token.waitForCompletion()阻塞当前线程,直到操作完成
- 如果超时或失败,抛出
MqttException
1.2.3 Token 的等待机制:waitForCompletion 实现
waitForCompletion 是如何实现阻塞等待的?让我们看看 Token 的内部实现:设计要点:
- 线程同步:使用
synchronized和wait/notify实现线程间通信
- volatile 关键字:
completed使用volatile保证可见性
- 超时机制:支持超时等待,避免无限阻塞
- 异常传播:将异步异常转换为同步异常抛出
1.2.4 完整的调用链
让我们追踪一个完整的
connect 调用链:1.3 设计模式分析:适配器模式 + 门面模式
这个设计同时体现了两种设计模式:
1.3.1 适配器模式(Adapter Pattern)
定义:将一个类的接口转换成客户希望的另一个接口,使原本不兼容的类可以一起工作。
在 Paho 中的应用:
- 目标接口:
IMqttClient(同步接口)
- 适配者:
MqttAsyncClient(异步接口)
- 适配器:
MqttClient(将异步接口适配为同步接口)
1.3.2 门面模式(Facade Pattern)
定义:为子系统中的一组接口提供一个统一的接口,定义一个高层接口使子系统更容易使用。
在 Paho 中的应用:
MqttClient作为门面,隐藏了MqttAsyncClient、ClientComms、ClientState等复杂子系统
- 用户只需与简单的
MqttClient交互,无需了解内部的线程管理、状态管理等复杂逻辑
1.4 设计优势分析
这种设计的优势体现在:
1.4.1 代码复用
传统做法(不推荐):
Paho 的做法:
- 只需维护一套核心逻辑(异步实现)
- 同步实现仅需几行代码,完全复用异步代码
- 修改时只需修改一处,降低维护成本
1.4.2 用户选择权
用户可以根据场景选择最合适的 API:
1.4.3 渐进式学习
- 新手可以从同步 API 开始,易于理解
- 随着需求复杂化,可以逐步迁移到异步 API
- 两种 API 可以混用(异步客户端也支持
waitForCompletion)
1.5 实际应用启示
这种设计思想可以应用到我们自己的项目中:
1.5.1 场景:HTTP 客户端库
1.5.2 场景:数据库操作库
1.6 潜在问题和改进
1.6.1 线程阻塞问题
问题:同步 API 会阻塞调用线程,不适合在 UI 线程或高并发场景使用。
解决方案:
- 明确文档说明使用场景
- 提供超时机制(
setTimeToWait())
- 推荐高并发场景使用异步 API
1.6.2 异常处理
问题:异步异常需要转换为同步异常,可能丢失一些上下文信息。
改进建议:
1.7 总结
通过适配器模式,Paho 实现了:
- 代码复用:同步实现完全复用异步代码,只需维护一套核心逻辑
- 用户友好:提供两种编程模型,用户可以根据场景选择
- 设计优雅:通过委托和等待机制,实现了简洁的适配层
这种设计体现了"DRY(Don't Repeat Yourself)"原则和"单一职责原则":
- 异步客户端负责核心业务逻辑
- 同步客户端负责接口适配
- 各司其职,职责清晰
2. 异步模型 / 回调机制 —— 观察者/回调/事件驱动设计
2.1 设计背景:为什么需要回调机制?
在异步编程模型中,一个核心问题是:如何知道异步操作何时完成?
传统同步编程:
异步编程的挑战:
解决方案:回调机制(Callback)和观察者模式(Observer Pattern)
2.2 Paho 中的回调机制设计
Paho 提供了多层次的回调机制,让我们深入分析其设计。
2.2.1 回调接口层次结构
Paho 的回调接口设计体现了接口隔离原则(ISP):
设计亮点:
- 职责分离:不同接口处理不同的事件类型,各司其职
- 接口继承:
MqttCallbackExtended扩展MqttCallback,保持向后兼容
- 灵活组合:可以同时使用全局回调和按主题的回调,满足不同场景需求
2.2.2 观察者模式的实现
让我们看看 Paho 如何实现观察者模式:
观察者模式的关键要素:
- Subject(主题):
CommsCallback管理回调列表
- Observer(观察者):
MqttCallback、IMqttMessageListener等回调接口
- 通知机制:
deliverMessage()方法通知所有观察者
2.2.3 事件驱动的消息处理流程
让我们追踪一个消息到达的完整流程:
关键设计:
- 独立回调线程:
CommsCallback在独立线程中执行,不阻塞网络 I/O 线程
- 消息队列:使用队列缓冲消息,平滑流量峰值
- 主题匹配:支持通配符主题匹配(
+、#),灵活订阅
2.2.4 回调线程的安全性
回调在独立线程中执行,需要注意线程安全:
设计要点:
- 异常隔离:回调中的异常不会影响客户端正常运行
- 线程命名:回调线程有明确的名称,便于问题定位和调试
- 队列大小限制:防止内存溢出,保证系统稳定性
2.3 设计模式分析:观察者模式 + 事件驱动
2.3.1 观察者模式(Observer Pattern)
定义:定义对象间一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会得到通知并自动更新。
在 Paho 中的应用:
优势:
- 解耦:消息生产者和消费者完全解耦,降低耦合度
- 动态:可以动态添加或移除观察者,灵活配置
- 灵活:支持多个观察者监听同一事件,实现多路处理
2.3.2 事件驱动架构(Event-Driven Architecture)
Paho 的回调机制体现了事件驱动架构的特点:
事件驱动 vs 轮询:
2.4 实际应用示例
2.4.1 多级回调示例
2.4.2 回调中的最佳实践
2.5 设计优势与局限
2.5.1 优势
- 解耦:消息生产者和消费者完全解耦
- 灵活:支持多级回调,可以按主题设置不同的处理器
- 高效:事件驱动,无需轮询,节省 CPU
- 可扩展:易于添加新的事件类型和回调
2.5.2 局限与改进
问题1:回调地狱(Callback Hell)
改进方案:使用 CompletableFuture(Java 8+)
问题2:回调异常处理
2.6 总结
通过观察者模式和事件驱动设计,Paho 实现了:
- 解耦:消息生产者和消费者完全解耦
- 灵活:支持多级回调机制
- 高效:事件驱动,无需轮询
- 可扩展:易于添加新的事件类型
这种设计在 IoT、高并发、事件驱动系统中非常常见,是异步编程的最佳实践。
3. 模块化 & 分层设计 —— 清晰分工 + 可扩展性 / 可维护性
3.1 设计背景:为什么需要模块化?
在大型软件系统中,一个核心挑战是:如何组织代码,使其易于理解、维护和扩展?
传统单体设计的痛点:
- 所有代码混在一起,难以定位问题
- 修改一个功能可能影响其他功能
- 难以测试和复用
- 团队协作困难
模块化设计的优势:
- 清晰分工:每个模块职责明确
- 易于维护:修改影响范围小
- 可扩展性:易于添加新功能
- 可测试性:模块可以独立测试
3.2 Paho 的分层架构设计
Paho 采用了经典的分层架构(Layered Architecture),让我们深入分析:
3.2.1 整体分层结构
设计原则:
- 依赖方向:上层依赖下层,下层不依赖上层
- 接口隔离:层间通过接口交互,不直接依赖实现
- 单一职责:每层只负责一个方面的功能
3.2.2 协议版本兼容设计
Paho 同时支持 MQTT v3.1.1 和 v5.0,如何优雅地实现版本兼容?
设计策略:独立模块 + 共享接口
设计亮点:
- 独立模块:v3 和 v5 是完全独立的模块,可以按需单独引入
- 相似结构:两个模块的类结构相似,降低学习成本和迁移成本
- 共享理念:虽然代码独立,但设计理念和架构保持一致
实际应用:
3.3 SPI 机制:插件化架构的核心
SPI(Service Provider Interface)是 Java 提供的一种服务发现机制,Paho 用它实现了插件化的网络模块架构。
3.3.1 SPI 机制原理
SPI 工作流程:
- 定义服务接口:
NetworkModuleFactory
- 实现服务:
TCPNetworkModuleFactory、SSLNetworkModuleFactory等
- 注册服务:在
META-INF/services/目录下注册
- 加载服务:使用
ServiceLoader动态加载
3.3.2 源码实现分析
让我们看看 Paho 如何实现 SPI:
SPI 配置文件:
3.3.3 自定义网络模块扩展
SPI 机制使得我们可以轻松扩展新的网络协议:
设计优势:
- 开闭原则:对扩展开放,对修改关闭,符合 SOLID 原则
- 解耦:客户端代码与具体实现解耦,提高灵活性
- 可插拔:运行时动态加载,无需修改核心代码,易于扩展
3.4 策略模式:可替换的组件实现
Paho 在多个地方使用了策略模式,让我们看看持久化机制的设计:
3.4.1 持久化策略接口
3.4.2 具体策略实现
3.4.3 策略的使用
设计优势:
- 可替换:运行时选择不同的实现,灵活配置
- 易扩展:可以轻松添加新的持久化策略(如 Redis、数据库等)
- 符合开闭原则:添加新策略无需修改现有代码,降低维护成本
3.5 模块化的实际价值
3.5.1 可维护性提升
清晰的模块边界:
- 修改网络层不影响协议层
- 修改持久化层不影响业务逻辑
- 每个模块可以独立测试
示例:修改网络实现
3.5.2 可扩展性提升
添加新功能:
- 添加新的网络协议:实现
NetworkModuleFactory
- 添加新的持久化方式:实现
MqttClientPersistence
- 添加新的协议版本:创建新模块
3.5.3 可测试性提升
模块独立测试:
3.6 总结
通过模块化和分层设计,Paho 实现了:
- 清晰分工:每个模块职责明确,易于理解
- 易于维护:修改影响范围小,降低风险
- 可扩展性:通过 SPI 和策略模式,易于扩展
- 可测试性:模块可以独立测试
这种设计是大型软件系统的最佳实践,值得在自己的项目中借鉴。
4. 资源管理 / 状态管理 / 连接管理 —— 对象生命周期 & 状态机设计
4.1 设计背景:为什么需要状态管理?
在 MQTT 客户端中,连接状态的管理是一个核心挑战:
- 连接状态:未连接、连接中、已连接、断开中
- 消息状态:待发送、发送中、已确认、失败
- 会话状态:临时会话、持久会话
如果状态管理不当,会导致:
- 消息丢失或重复
- 资源泄漏
- 连接异常
- 难以调试
4.2 连接状态机设计
Paho 使用状态机模式管理连接状态,让我们深入分析:
4.2.1 状态定义
4.2.2 状态转换逻辑
让我们看看
ClientState 如何管理状态转换:状态转换图:
4.2.3 线程安全的状态管理
状态转换需要考虑线程安全:
4.3 消息状态管理
消息在发送过程中会经历多个状态,Paho 通过多个数据结构管理:
4.3.1 消息状态流转
4.3.2 源码实现
4.4 资源管理:持久化机制
持久化是保证消息可靠性的关键,让我们看看 Paho 如何管理持久化资源:
4.4.1 持久化键设计
Paho 使用前缀区分不同类型的持久化数据:
设计优势:
- 分类清晰:通过前缀快速识别数据类型,便于管理
- 易于清理:可以按类型批量清理,提高效率
- 避免冲突:不同类型的消息使用不同前缀,避免键冲突
4.4.2 状态恢复机制
客户端重启后,需要从持久化恢复状态:
4.5 对象生命周期管理
4.5.1 客户端生命周期
4.5.2 资源清理
4.6 总结
通过状态机和资源管理,Paho 实现了:
- 可靠的状态转换:清晰的状态定义和转换逻辑
- 线程安全:使用 volatile 和 synchronized 保证状态一致性
- 资源管理:正确的生命周期管理和资源清理
- 状态恢复:支持从持久化恢复状态
这种设计保证了 MQTT 客户端的可靠性和健壮性。
5. 面向接口 & 解耦 —— 接口 / 抽象 + 具体实现分离
5.1 设计背景:为什么需要接口抽象?
在软件设计中,一个核心原则是:依赖抽象,而不是依赖具体实现。
直接依赖具体实现的弊端:
- 难以替换实现
- 难以测试(无法 Mock)
- 耦合度高,修改影响大
依赖接口的优势:
- 易于替换实现
- 易于测试
- 降低耦合度
5.2 Paho 中的接口设计
5.2.1 客户端接口层次
设计优势:
- 接口隔离:同步和异步接口分离,职责清晰,符合接口隔离原则
- 多态支持:可以基于接口编程,提高代码灵活性
- 易于 Mock:测试时可以轻松 Mock 接口,提高可测试性
5.2.2 持久化接口设计
依赖注入的优势:
5.3 依赖倒置原则(DIP)
Paho 的设计体现了依赖倒置原则:
传统设计(不推荐):
Paho 的设计(推荐):
优势:
- 高层模块不依赖低层模块的具体实现
- 低层模块的变化不影响高层模块
- 易于扩展和测试
5.4 接口隔离原则(ISP)
Paho 的接口设计体现了接口隔离原则:
设计优势:
- 职责单一:每个接口只负责一个方面的功能,符合单一职责原则
- 按需实现:实现类只需要实现需要的接口,避免不必要的实现
- 易于扩展:可以组合多个接口,灵活扩展功能
5.5 实际应用启示
5.5.1 在我们的项目中应用
5.5.2 测试中的应用
5.6 总结
通过面向接口设计和依赖倒置,Paho 实现了:
- 解耦:高层模块不依赖低层模块的具体实现
- 可扩展:易于添加新的实现
- 可测试:可以轻松 Mock 接口
- 灵活性:运行时选择不同的实现
这种设计是面向对象设计的最佳实践。
6. 对你自己项目/未来工程实践的启示 —— 结合 IoT / 智能硬件背景分析
6.1 IoT 场景的特殊需求
在 IoT 和智能硬件场景中,MQTT 客户端的设计面临特殊挑战:
- 资源受限:内存、CPU、存储有限
- 网络不稳定:经常断网重连
- 低功耗要求:需要优化能耗
- 可靠性要求:关键数据不能丢失
6.2 从 Paho 设计中学习的架构模式
6.2.1 异步 + 回调 + 模块化设计
在 IoT 设备中的应用:
设计要点:
- ✅ 异步 API:不阻塞设备主线程,提高响应性
- ✅ 事件驱动:通过回调处理消息,高效且资源占用低
- ✅ 自动重连:网络不稳定时自动恢复连接,提高可靠性
- ✅ 模块化:消息处理独立模块,易于维护和扩展
6.2.2 持久化机制保障可靠性
在边缘设备中的应用:
优势:
- 设备重启后可以恢复未完成的消息,保证数据完整性
- 网络断开时消息不会丢失,提高可靠性
- 适合关键数据的可靠传输,满足业务需求
6.2.3 自定义持久化实现
场景:使用数据库或 Redis 作为持久化存储
6.3 设备网关 / 集中管理场景
6.3.1 多客户端管理
场景:设备网关需要管理多个设备的连接
设计要点:
- ✅ 共享资源:多个客户端共享线程池,节省系统资源
- ✅ 统一管理:集中管理所有设备连接,便于监控和维护
- ✅ 异步处理:不阻塞网关主线程,提高系统吞吐量
6.3.2 虚拟电厂 / 能源管理场景
场景:管理大量分布式能源设备
6.4 从 Paho 学习的设计原则总结
6.4.1 模块化设计
应用:将系统拆分为独立的模块
6.4.2 接口抽象
应用:定义清晰的接口,便于替换实现
6.4.3 状态管理
应用:使用状态机管理设备状态
6.5 总结
从 Paho 的设计中,我们可以学习到:
- 异步 + 回调:适合 IoT 设备的高效通信模式
- 模块化设计:清晰的模块划分,易于维护和扩展
- 接口抽象:依赖接口而非实现,提高灵活性
- 状态管理:使用状态机管理复杂的状态转换
- 持久化机制:保证关键数据的可靠性
这些设计思想可以应用到 IoT、边缘计算、设备管理等场景中。
7. 潜在改进/个人思考(Future-looking / Critical View)
7.1 高并发场景下的性能优化
7.1.1 当前实现的潜在瓶颈
问题1:回调线程单线程处理
当前
CommsCallback 使用单线程处理所有回调,在高并发场景下可能成为瓶颈:改进建议:使用线程池处理回调
优势:
- 提高并发处理能力,适合高吞吐量场景
- 避免回调阻塞影响其他消息处理,提高系统稳定性
- 可以配置线程池大小,灵活调整性能
权衡:
- 增加系统复杂度,需要额外的线程管理
- 需要管理线程池生命周期,增加资源管理负担
- 消息顺序可能被打乱,需要额外处理保证顺序性
7.1.2 消息队列优化
问题2:Vector 的性能问题
当前使用
Vector 作为消息队列,在高并发下性能不佳:改进建议:使用
ConcurrentLinkedQueue 或 LinkedBlockingQueue优势:
- 更好的并发性能,适合高并发场景
- 非阻塞操作,提高系统响应性
- 支持背压(队列满时阻塞生产者),防止内存溢出
7.2 资源受限设备的优化
7.2.1 轻量级持久化
问题:文件持久化在资源受限设备上可能太重
改进建议:提供更轻量的持久化选项
7.2.2 内存优化
问题:消息缓冲可能占用大量内存
改进建议:可配置的缓冲策略
7.3 协议扩展性
7.3.1 MQTT 5.1+ 支持
未来方向:支持 MQTT 5.1 及后续版本的新特性
- 更细粒度的错误码
- 增强的会话管理
- 新的 QoS 级别
设计建议:保持模块化设计,便于扩展
7.3.2 自定义协议支持
场景:支持 MQTT over CoAP、MQTT over QUIC 等
设计建议:通过 SPI 机制扩展
7.4 监控和可观测性
7.4.1 指标收集
改进建议:提供内置的指标收集
7.4.2 分布式追踪支持
改进建议:支持 OpenTracing / OpenTelemetry
7.5 错误处理和恢复
7.5.1 更细粒度的错误处理
改进建议:提供更详细的错误信息
7.5.2 自动恢复策略
改进建议:可配置的恢复策略
7.6 总结
潜在的改进方向:
- 性能优化:线程池回调、并发队列、批量操作
- 资源优化:轻量级持久化、内存管理、配置化缓冲
- 协议扩展:支持新版本、自定义传输协议
- 可观测性:指标收集、分布式追踪
- 错误处理:细粒度错误信息、自动恢复策略
这些改进可以进一步提升 Paho 的性能和可用性,但需要在复杂性和功能之间找到平衡,避免过度设计。
8. 结语
8.1 设计模式回顾
通过深入源码分析,我们在 Paho Java Client 中识别出了以下设计模式:
设计模式 | 应用场景 | 价值 |
适配器模式 | MqttClient 包装 MqttAsyncClient | 代码复用,提供两种 API |
观察者模式 | 回调机制 | 解耦消息生产者和消费者 |
策略模式 | 网络模块、持久化 | 运行时选择不同实现 |
工厂模式 | NetworkModuleService | 通过 SPI 创建网络模块 |
状态模式 | 连接状态管理 | 清晰的状态转换逻辑 |
模板方法模式 | WireMessage 序列化 | 统一的序列化流程 |
生产者-消费者模式 | 消息队列处理 | 解耦消息产生和发送 |
装饰器模式 | MqttInputStream/OutputStream | 增强流功能 |
8.2 架构设计原则回顾
Paho 的设计体现了以下 SOLID 原则:
- 单一职责原则(SRP):每个类职责明确
- 开闭原则(OCP):通过 SPI 和策略模式实现扩展
- 里氏替换原则(LSP):接口实现可以互相替换
- 接口隔离原则(ISP):细粒度的接口设计
- 依赖倒置原则(DIP):依赖接口而非实现
8.3 核心设计思想
- 模块化设计:清晰的分层架构,职责分明
- 接口抽象:依赖接口而非实现,提高灵活性
- 事件驱动:异步回调机制,高效处理消息
- 状态管理:状态机模式管理连接和消息状态
- 可扩展性:SPI 机制支持插件化架构
8.4 对工程实践的启示
8.4.1 设计原则
- 优先使用接口:定义清晰的接口,依赖抽象
- 模块化设计:将系统拆分为独立的模块
- 关注点分离:每个模块只负责一个方面
- 可扩展性:考虑未来扩展需求
8.4.2 实现技巧
- 适配器模式:复用现有实现,提供新接口
- SPI 机制:实现插件化架构
- 状态机:管理复杂的状态转换
- 回调机制:实现事件驱动架构
8.4.3 最佳实践
- 线程安全:使用 volatile、synchronized 保证线程安全
- 资源管理:正确管理资源生命周期
- 错误处理:提供详细的错误信息
- 可测试性:设计易于测试的接口
8.5 深入源码分析的价值
通过深入源码分析,我们不仅学会了如何使用 Paho,更重要的是:
- 理解设计思想:理解了为什么这样设计,好处是什么
- 学习最佳实践:学习了业界最佳的设计模式和架构思想
- 提升工程能力:提升了架构设计和代码质量
- 解决实际问题:当遇到问题时,可以基于源码找到解决方案
8.6 未来展望
随着 IoT、边缘计算、5G 等技术的发展,MQTT 客户端库将面临新的挑战:
- 更高性能:支持更高的并发和吞吐量
- 更低延迟:优化网络传输和消息处理
- 更好可靠性:增强错误处理和恢复机制
- 更强扩展性:支持更多协议和特性
Paho 的设计为这些挑战提供了良好的基础,通过模块化、接口抽象、SPI 机制等设计,可以持续演进和扩展。
8.7 结语
Eclipse Paho Java Client 是一个设计精良的开源库,通过深入源码分析,我们看到了:
- 优雅的设计模式:适配器、观察者、策略等模式的精妙应用
- 清晰的架构设计:分层架构、模块化设计的实践
- 工程化的实现:线程安全、资源管理、错误处理的最佳实践
这些设计思想和实现技巧不仅适用于 MQTT 客户端,更可以应用到我们自己的项目中。希望本文能够帮助读者:
- 深入理解 Paho 的设计思想和实现细节,掌握其设计精髓
- 学习借鉴 优秀的设计模式和架构思想,提升架构设计能力
- 提升能力 在项目中应用这些最佳实践,提高代码质量
源码是最好的老师,深入源码分析是提升技术能力的最佳途径。让我们一起在源码中学习,在实践中成长!
相关资料:
- 作者:Yibin
- 链接:https://yibin.dev/article/2bb60b50-99a4-804b-83f8-d42c3c5fb1c4
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章






