【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 管理错误信息 | 全局配置、线程池管理 |
核心价值:
- 解耦:通过工厂、代理等模式隔离变化点。
- 扩展性:策略、装饰器模式支持灵活扩展功能。
- 复用性:模板方法、责任链模式复用通用流程。
掌握这些模式的应用场景,能显著提升代码的可维护性和架构的灵活性。