目录
3. 动态代理模式(Dynamic Proxy Pattern)
4. 模板方法模式(Template Method Pattern)
7. 责任链模式(Chain of Responsibility 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;
// 私有构造,强制使用 Builder
private 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; }
@Override
public 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 {
@Override
protected void prepareData() { ... }
@Override
protected 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; }
@Override
public 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 管理错误信息 | 全局配置、线程池管理 |
核心价值:
- 解耦:通过工厂、代理等模式隔离变化点。
- 扩展性:策略、装饰器模式支持灵活扩展功能。
- 复用性:模板方法、责任链模式复用通用流程。
掌握这些模式的应用场景,能显著提升代码的可维护性和架构的灵活性。
转载自CSDN-专业IT技术社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_31815507/article/details/147684460