【Mytais系列】Myatis的设计模式

目录

设计模式

1. 工厂模式(Factory Pattern)

2. 建造者模式(Builder Pattern)

3. 动态代理模式(Dynamic Proxy Pattern)

4. 模板方法模式(Template Method Pattern)

5. 策略模式(Strategy Pattern)

6. 装饰器模式(Decorator Pattern)

7. 责任链模式(Chain of Responsibility Pattern)

8. 单例模式(Singleton Pattern)

总结


设计模式


1. 工厂模式(Factory Pattern)

MyBatis 中的应用

  • SqlSessionFactory:通过工厂创建 SqlSession 对象,屏蔽了底层连接池、事务等细节。
  • ObjectFactory:负责创建结果集映射的 Java 对象(如 POJO),支持自定义扩展。

日常开发借鉴

  • 场景:需要解耦对象的创建与使用时。
  • 示例:数据库连接池、日志工厂、配置解析器等。
// 简单工厂示例
public class ConnectionFactory {public static Connection getConnection(String dbType) {if ("mysql".equals(dbType)) {return new MySqlConnection();} else if ("oracle".equals(dbType)) {return new OracleConnection();}throw new IllegalArgumentException("Unsupported DB type");}
}

2. 建造者模式(Builder Pattern)

MyBatis 中的应用

  • XMLConfigBuilder:解析 mybatis-config.xml,逐步构建 Configuration 对象。
  • SqlSessionFactoryBuilder:通过链式调用构建 SqlSessionFactory

日常开发借鉴

  • 场景:需要分步构造复杂对象,尤其是参数多且可选时。
  • 示例:构建 HTTP 请求参数、配置复杂 DTO 对象。
// 建造者示例:构建用户对象
public class User {private String name;private int age;// 私有构造,强制使用 Builderprivate User(Builder builder) { ... }public static class Builder {private String name;private int age;public Builder name(String name) { this.name = name; return this; }public Builder age(int age) { this.age = age; return this; }public User build() { return new User(this); }}
}// 使用
User user = new User.Builder().name("Alice").age(30).build();

3. 动态代理模式(Dynamic Proxy Pattern)

MyBatis 中的应用

  • Mapper 接口代理:通过 MapperProxy 动态生成 Mapper 接口的实现类,将方法调用转发到 SQL 执行逻辑。

日常开发借鉴

  • 场景:需为接口动态生成实现,或在方法调用前后添加统一逻辑(如日志、事务)。
  • 示例:RPC 客户端、AOP 切面编程、权限校验拦截器。
// JDK 动态代理示例
public class LogProxy implements InvocationHandler {private Object target;public LogProxy(Object target) { this.target = target; }@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Method " + method.getName() + " called");return method.invoke(target, args);}
}// 使用
UserService userService = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),new Class[]{UserService.class},new LogProxy(new UserServiceImpl())
);

4. 模板方法模式(Template Method Pattern)

MyBatis 中的应用

  • Executor 接口:定义了 update, query 等方法的执行流程,具体实现由子类(如 SimpleExecutor, BatchExecutor)完成。
  • BaseExecutor:抽象类封装了缓存管理、事务提交等通用逻辑,子类仅需实现 doUpdate, doQuery 等具体步骤。

日常开发借鉴

  • 场景:多个类有相同流程,但某些步骤需差异化实现。
  • 示例:支付流程(统一下单、验签,支付方式不同)、数据导出模板。
// 模板方法示例:数据导出
public abstract class DataExporter {// 模板方法:定义流程public final void export() {prepareData();formatData();saveToFile();}protected abstract void prepareData();protected abstract void formatData();private void saveToFile() {System.out.println("Saving data to file...");}
}// 子类实现
public class CsvExporter extends DataExporter {@Overrideprotected void prepareData() { ... }@Overrideprotected void formatData() { ... }
}

5. 策略模式(Strategy Pattern)

MyBatis 中的应用

  • Executor 类型选择:根据配置选择 SIMPLE, REUSE, BATCH 等执行策略。
  • TypeHandler 选择:根据 Java 类型和 JDBC 类型动态选择处理器。

日常开发借鉴

  • 场景:需根据不同条件切换算法或策略。
  • 示例:排序算法选择(快排、归并排序)、支付方式(支付宝、微信)。
// 策略模式示例:支付方式
public interface PaymentStrategy {void pay(double amount);
}public class AlipayStrategy implements PaymentStrategy { ... }
public class WechatPayStrategy implements PaymentStrategy { ... }public class PaymentContext {private PaymentStrategy strategy;public PaymentContext(PaymentStrategy strategy) { this.strategy = strategy; }public void executePay(double amount) { strategy.pay(amount); }
}// 使用
PaymentContext context = new PaymentContext(new AlipayStrategy());
context.executePay(100.0);

6. 装饰器模式(Decorator Pattern)

MyBatis 中的应用

  • Cache 实现:通过 LruCache, FifoCache 等装饰器为缓存添加特性。
  • Connection 包装:使用 PooledConnection 装饰原生连接,实现连接池管理。

日常开发借鉴

  • 场景:动态为对象添加功能,避免继承导致的类膨胀。
  • 示例:增强 IO 流(缓冲、加密)、为服务添加日志或限流功能。
// 装饰器示例:带加密功能的输入流
public class EncryptedInputStream extends InputStream {private InputStream wrappedStream;public EncryptedInputStream(InputStream stream) { this.wrappedStream = stream; }@Overridepublic int read() throws IOException {int data = wrappedStream.read();return decrypt(data); // 解密逻辑}private int decrypt(int data) { ... }
}// 使用
InputStream rawStream = new FileInputStream("data.bin");
InputStream encryptedStream = new EncryptedInputStream(rawStream);

7. 责任链模式(Chain of Responsibility Pattern)

MyBatis 中的应用

  • 插件机制(Interceptor Chain):多个插件通过责任链模式依次拦截 Executor, StatementHandler 等方法调用。

日常开发借鉴

  • 场景:需多个处理器按顺序处理同一请求。
  • 示例:过滤器链(权限校验、日志记录)、审批流程(多级审批)。
// 责任链示例:权限校验链
public interface Filter {void doFilter(Request request, Response response, FilterChain chain);
}public class AuthFilter implements Filter {public void doFilter(Request request, Response response, FilterChain chain) {if (checkAuth(request)) {chain.doFilter(request, response); // 传递到下一个过滤器} else {response.setError("Unauthorized");}}
}// 使用
FilterChain chain = new FilterChain();
chain.addFilter(new AuthFilter()).addFilter(new LogFilter());
chain.doFilter(request, response);

8. 单例模式(Singleton Pattern)

MyBatis 中的应用

  • ErrorContext:线程级别的单例,记录当前线程的 SQL 执行错误信息。
  • LogFactory:通过单例管理日志实现类。

日常开发借鉴

  • 场景:全局唯一对象(配置管理器、线程池、缓存实例)。
  • 示例:数据库连接池、应用配置中心。
// 单例示例:双重校验锁
public class DatabasePool {private static volatile DatabasePool instance;private DatabasePool() { ... }public static DatabasePool getInstance() {if (instance == null) {synchronized (DatabasePool.class) {if (instance == null) {instance = new DatabasePool();}}}return instance;}
}

总结

设计模式

MyBatis 应用场景

日常开发借鉴场景

工厂模式

SqlSessionFactory 创建对象

数据库连接池、日志工厂

建造者模式

构建 Configuration 对象

复杂 DTO 构建、HTTP 请求参数封装

动态代理

Mapper 接口实现

RPC 客户端、AOP 切面

模板方法

Executor 执行流程

统一流程(支付、导出)

策略模式

不同 Executor 实现选择

算法切换(排序、支付方式)

装饰器模式

Cache 功能增强

IO 流增强(缓冲、加密)

责任链模式

插件拦截器链

过滤器链(权限、日志)

单例模式

ErrorContext 管理错误信息

全局配置、线程池管理

核心价值

  • 解耦:通过工厂、代理等模式隔离变化点。
  • 扩展性:策略、装饰器模式支持灵活扩展功能。
  • 复用性:模板方法、责任链模式复用通用流程。

掌握这些模式的应用场景,能显著提升代码的可维护性和架构的灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【unity游戏开发入门到精通——UGUI】Mask组件实现UGUI遮罩

注意:考虑到UGUI的内容比较多,我将UGUI的内容分开,并全部整合放在【unity游戏开发——UGUI】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言如何实现UI遮罩1、Mask组件2、实例3、注意 专栏推荐完结 前言 Mask遮罩是…

Github2025-05-04php开源项目日报 Top10

根据Github Trendings的统计,今日(2025-05-04统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Shell项目1Vue项目1Java项目1ASP项目1SecLists - 安全测试人员的伴侣 创建周期:4375 天开发语言:PHP协议类型:MIT LicenseStar数量…

MyBatis 一对多与多对一映射详解教程

一、基础概念与场景 一对多(One-to-Many) • 定义:一个父对象包含多个子对象。 例如:一个商品(Goods)对应多个商品详情(GoodsDetail) • 实体类表现:父类中包含 List&l…

ChatGPT:重塑人工智能交互范式的破晓之作

2022年11月30日,总部位于旧金山的研究公司OpenAI正式发布了ChatGPT——一款以病毒式传播速度席卷全球的AI聊天机器人。它不仅能像人类一样生成内容、回答问题和解决问题,更在推出后的两个月内吸引了超过1亿月活跃用户,刷新了消费级技术应用的最快采用率纪录。这一里程碑事件…

在项目中如何对Map List等对象序列化及反序列化

我们知道,在自定义类中,若想完成序列化必须要实现Serializable接口。 那么在实现后如何进行序列化呢? 一.普通对象 序列化: 1.首先我们要定义一个 序列化所需要的工具类 ObjectMapper //定义序列化所需要的工具类 转化机器…

笔试专题(十五)

文章目录 排序子序列题解代码 消减整数题解代码 最长公共子序列(二)题解代码 排序子序列 题目链接 题解 1. 贪心 模拟 2. 1 2 3 2 2 应该是有两个排列子序列的,所以i n-1时ret 3. 把水平的位置和上升部分,水平位置和下降部分分为一个排列子序列 代…

Amazon Bedrock Converse API:开启对话式AI新体验

Amazon Bedrock Converse API:开启对话式AI新体验 前言 在当今人工智能飞速发展的时代,对话式AI已成为众多应用的核心组成部分。从智能客服到智能助手,对话式AI为用户带来了便捷且高效的交互体验。而Amazon Bedrock Converse API的出现&…

【Springboot知识】Springboot计划任务Schedule详解

文章目录 Spring Boot 定时任务从原理到实现详解一、核心原理分析1. 架构分层2. 核心组件3. 线程模型 二、基础实现步骤1. 添加依赖2. 主类配置3. 定时任务类 三、高级配置技巧1. 自定义线程池2. 动态配置参数3. 分布式锁集成(Redis示例) 四、异常处理机…

MySQL:联合查询

目录 一、笛卡尔积 ​二、内连接 三、外连接 (1)左外连接 (2)右外连接 (3)全外连接 四、自连接 五、子查询 (1)单行子查询 (2)多行子查询 &…

深入理解 Cortex-M3 的内核寄存器组

每个 MCU 开发工程师一定都了解寄存器这个东西,以 STM32 为例,其拥有非常多的外设模块,如串口、SPI、IIC 等等,如果要使用这些外设,使其按照我们的要求工作,就需要配置这些外设的寄存器,往这些寄…

网络安全自动化:找准边界才能筑牢安全防线

数字时代,企业每天要面对成千上万的网络攻击。面对庞大的服务器群、分散的团队和长期不重启的设备,很多企业开始思考:哪些安全操作适合交给机器自动处理?哪些必须由人工把关?今天我们就用大白话聊聊这件事。 一、这些事…

C++负载均衡远程调用学习之负载均衡算法与实现

目录 01 lars 系统架构回顾 02 lars-lbAgentV0.4-route_lb处理report业务流程 03 lars-lbAgentV0.4-负责均衡判断参数配置 04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断 05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断 06 lars-lbAgentV0.4-负载均衡上报提交…

领略算法真谛: 多源bfs

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…

雷电模拟器-超好用的Windows安卓模拟器

一、雷电模拟器介绍 雷电模拟器是一款功能强大的软件,它能够在电脑上模拟出安卓手机系统,让你可以在电脑上运行各类手机应用及游戏。其采用虚拟安卓手机操作界面,为玩家带来了独特的体验。 (一)强大的兼容性 雷电模拟…

文章三《机器学习基础概念与框架实践》

文章3:机器学习基础概念与框架实践 ——从理论到代码,用Scikit-learn构建你的第一个分类模型 一、机器学习基础理论:三大核心类型 机器学习是人工智能的核心,通过数据让计算机自动学习规律并做出预测或决策。根据学习方式,可分为三类: 1. 监督学习(Supervised Learni…

脑机接口技术:开启人类与机器的全新交互时代

在科技飞速发展的今天,人类与机器的交互方式正经历着前所未有的变革。从最初的键盘鼠标,到触摸屏,再到语音控制,每一次交互方式的升级都极大地提升了用户体验和效率。如今,脑机接口(Brain-Computer Interfa…

8.2 GitHub企业级PDF报告生成实战:ReportLab高级技巧与性能优化全解析

GitHub企业级PDF报告生成实战:ReportLab高级技巧与性能优化全解析 GitHub Sentinel 高级功能实现:PDF 报告生成技术详解 关键词:PDF 报告生成, ReportLab 实战, 结构化数据转换, 容器化字体配置, 企业级报告模板 1. 需求分析与技术选型 PDF 报告生成需要满足以下技术要求…

架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案

文章目录 引言一、升级读服务架构,为什么需要自动化测试?二、自动化回归测试系统:整体架构概览三、日志收集1. 拦截方式2. 存储与优化策略3. 架构进化 四、数据回放技术实现关键能力 五、差异对比对比方式灵活配置 六、三种回放模式详解1. 离…

基于Spring Boot 3.0、ShardingSphere、PostgreSQL或达梦数据库的分库分表

要实现基于Spring Boot 3.0、ShardingSphere、PostgreSQL或达梦数据库的分库分表,首先需要对ShardingSphere进行一些基本配置。你提到的溯源码、批次号等数据需要考虑到跨年数据的存储,因此要设计一个能够动态扩展的分表策略 添加ShardingSphere依赖 在…

位运算的应用

1. 判断偶数&#xff0c;判断最低位是0还是1即可&#xff0c;⽐求模快 x % 2 ! 0 //x正负都可以判断&#xff1b;不⽤x%2 1&#xff0c;因为如果x为负奇数&#xff0c;x%2-1 (x & 0x1) 0 例如&#xff1a; int x; int main() { cin>>x; if((x & 0x1)0) cout<…