Appearance
模板方法模式在开源框架设计中的应用
模板方法模式在开源框架中的应用分析
1. Spring Framework中的模板方法模式
java
// Spring中的模板方法模式典型实现
public abstract class AbstractApplicationContext implements ConfigurableApplicationContext {
// 模板方法:应用上下文刷新
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 准备刷新
prepareRefresh();
// 获取BeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 准备BeanFactory
prepareBeanFactory(beanFactory);
// 后置处理BeanFactory
postProcessBeanFactory(beanFactory);
// 执行BeanFactory后置处理器
invokeBeanFactoryPostProcessors(beanFactory);
// 注册Bean后置处理器
registerBeanPostProcessors(beanFactory);
// 初始化消息源
initMessageSource();
// 初始化事件广播器
initApplicationEventMulticaster();
// 模板方法:子类可以重写的空方法
onRefresh();
// 注册监听器
registerListeners();
// 完成Bean初始化
finishBeanFactoryInitialization(beanFactory);
// 完成刷新
finishRefresh();
}
}
// 钩子方法:供子类实现的扩展点
protected void onRefresh() throws BeansException {
// 默认空实现,子类可以重写
}
}2. MyBatis中的模板方法模式
java
// MyBatis中的SqlSession模板方法
public abstract class SqlSessionTemplate implements SqlSession {
private final SqlSession sqlSessionProxy;
// 模板方法:执行数据库操作
private <T> T execute(SqlSessionCallback<T> action) {
try {
// 前置处理
beforeExecution();
// 执行数据库操作
T result = action.doInSqlSession(sqlSessionProxy);
// 后置处理
afterExecution();
return result;
} catch (Exception e) {
// 异常处理
handleException(e);
throw new MyBatisSystemException(e);
}
}
// 数据库操作模板
@Override
public <E> List<E> selectList(String statement) {
return execute(sqlSession -> sqlSession.selectList(statement));
}
// 钩子方法:可扩展的前置和后置处理
protected void beforeExecution() {
// 可选的前置处理
}
protected void afterExecution() {
// 可选的后置处理
}
protected void handleException(Exception e) {
// 异常处理策略
}
}3. JUnit测试框架中的模板方法模式
java
// JUnit中的测试模板
public abstract class TestCase extends Assert implements Test {
// 测试模板方法
public void runTest() throws Throwable {
// 前置准备
setUp();
try {
// 执行具体测试方法
runBare();
} finally {
// 后置清理
tearDown();
}
}
// 钩子方法:测试前准备
protected void setUp() throws Exception {
// 默认空实现,子类可重写
}
// 钩子方法:测试后清理
protected void tearDown() throws Exception {
// 默认空实现,子类可重写
}
// 抽象方法:强制子类实现
protected abstract void runTest() throws Throwable;
}模板方法模式在开源框架中的应用特点
- 统一执行流程
- 定义标准算法骨架
- 控制整体执行步骤
- 提供可插拔的扩展点
- 灵活性设计
- 使用抽象类和接口
- 提供钩子方法
- 支持部分方法重写
- 扩展机制
- 抽象方法强制实现
- 钩子方法可选重写
- 提供默认实现
设计原则与最佳实践
- 开闭原则
- 对扩展开放
- 对修改关闭
- 通过继承和接口实现
- 依赖倒置
- 依赖抽象而非具体
- 解耦框架核心逻辑
- 单一职责
- 每个方法职责单一
- 高内聚低耦合
使用建议
- 谨慎设计抽象类层次
- 合理使用final方法
- 提供清晰的文档
- 避免过度继承
- 关注性能开销
应用场景
- 框架生命周期管理
- 标准化处理流程
- 事务管理
- 测试框架
- ORM框架
- 依赖注入容器
模板方法模式在开源框架中扮演着核心的架构角色,它通过定义统一的执行流程和可扩展的设计机制,为框架提供了灵活且标准化的实现方式。这种模式不仅降低了框架的使用复杂度,还为开发者提供了强大的定制能力。
更新: 2025-01-25 21:02:10
原文: https://www.yuque.com/tulingzhouyu/db22bv/kpkd4h9932sphpz0