当前位置: 首页 > 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 管理错误信息

全局配置、线程池管理

核心价值

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

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

相关文章:

  • 基于51单片机小型风扇设计—红外遥控
  • MySQL基础关键_006_DQL(五)
  • Vue3学习笔记2——路由守卫
  • 如何用CSS实现HTML元素的旋转效果:从基础到高阶应用
  • c++26新功能——gcc15.1的支持
  • Java大师成长计划之第11天:Java Memory Model与Volatile关键字
  • NVMe控制器之完成信息解析模块
  • 单片机嵌入式字符流数据解析库
  • c++ 二级指针 vs 指针引用
  • AI生成视频检测方法及其相关研究
  • 【电路笔记】-自耦变压器
  • java学习之数据结构:三、八大排序
  • 生成式 AI 的重要性
  • 在MySQL中建索引时需要注意哪些事项?
  • 【Linux知识】find命令行使用详解
  • 《ATPL地面培训教材13:飞行原理》——第5章:升力
  • 生物化学笔记:神经生物学概论08 运动系统 人类逐渐建立运动技能 不同层次的运动发起
  • 【AutoDL】云服务器配置指南
  • 架构师-金丝雀与蓝绿发布
  • vue3+ts vite打包结构控制通过rollup进行配置
  • 上千游客深夜滞留张家界大喊退票?当地通报情况并致歉
  • “仿佛一场追星粉丝会”,老铺黄金完成国内头部商业中心全覆盖,品牌化后下一步怎么走?
  • 5名中国公民在美国交通事故中遇难
  • 2025上海车展圆满闭幕,共接待海内外观众101万人次
  • 用小型核反应堆给数据中心供电,国内企业正在开展项目论证
  • 世界黄金协会:一季度全球黄金投资需求同比增170%