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

【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.xdnf.cn/news/267985.html

相关文章:

  • API接口:轻松获取企业联系方式
  • 理解Android Studio IDE工具
  • 虚幻基础:角色朝向
  • MIT6.S081-lab8前置
  • C++ 开发指针问题:E0158 表达式必须为左值或函数指示符
  • UDP 通信详解:`sendto` 和 `recvfrom` 的使用
  • python进阶(1)字符串
  • DeepSeek-Prover-V2-671B:AI在数学定理证明领域的重大突破
  • 随机变量数字特征
  • 第六章,BGP---边界网关协议
  • 【原创】风云扫描王[特殊字符]OCR识别翻译!证件照
  • 202553-sql
  • 信创开发中跨平台开发框架的选择与实践指南
  • 【AI提示词】墨菲定律思维模型
  • 网络通信领域的基础或流行协议
  • GitHub Actions 和 GitLab CI/CD 流水线设计
  • 高中数学联赛模拟试题精选学数学系列第5套几何题
  • ROS学习笔记之《ROS里那些专有名词》
  • 分布式事务解决方案
  • BG开发者日志505:项目总体情况
  • 强化学习中的策略评估与改进:从理论到实践(二)
  • 【JAVA】数组与内存模型:二维数组底层实现(9)
  • IO模型和多路复用
  • TCP协议:三次握手与四次挥手解析
  • 定时器6计时功能
  • KBNE女装是什么牌子?KBNE女装属于什么档次质量如何?
  • 琴生不等式 (Jensen‘s Inequality)
  • 基于Springboot+Mysql的校园博客系统(含LW+PPT+源码+系统演示视频+安装说明)
  • 第 13 届蓝桥杯 C++ 青少组省赛中 / 高级组 2022 年真题(编程第一题)
  • 马克思最基本的哲学思想--改造世界以实现人的自由全面发展--deepseek