一、定义
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
二、结构
三、实现
Game
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
//模板
public final void play() {
//初始化游戏
initialize();
//开始游戏
startPlay();
//结束游戏
endPlay();
}
}
Cricket
public class Cricket extends Game {
@Override
void endPlay() {
System.out.println("Cricket Game Finished!");
}
@Override
void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
}
FootBall
public class Football extends Game {
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
}
测试
public class TemplatePatternDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
四. mybatis模板模式浅探之BaseExecutor
BaseExecutor 主要负责实现 MyBatis 中的 SQL 语句执行逻辑,包括缓存管理、事务管理和 SQL 语句的执行。具体来说,它的主要作用包括:
- 提供缓存管理功能:BaseExecutor 通过维护两级缓存,实现了对 SQL 语句执行结果的缓存。一级缓存是基于执行器的,二级缓存是基于 SqlSessionFactory 的。这样可以大大减少数据库访问次数,提高应用程序的性能。
- 实现事务管理功能:BaseExecutor 提供了事务管理功能,可以控制事务的提交和回滚。在执行 SQL 语句的过程中,如果发生异常,BaseExecutor 会自动回滚事务,保证数据的完整性。
- 执行 SQL 语句:BaseExecutor 通过调用 StatementHandler 对象的方法,执行 SQL 语句并返回执行结果。在执行 SQL 语句之前,BaseExecutor 会将 SQL 语句和参数传递给 StatementHandler 对象,由它来进行具体的执行操作。
根据传入的语句类型,创建不同的语句处理器,执行不同的方法。避免了多重条件判断,动态选择行为。
![](https://img-blog.csdnimg.cn/f7f470cbc3624033a0863116f3c3a1a1.
public class BaseExecutor implements Executor{
private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
List<E> list;
localCache.putObject(key, EXECUTION_PLACEHOLDER);
try {
// 根据不同的执行器调用查询方法。
list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);
} finally {
localCache.removeObject(key);
}
// 存入缓存
localCache.putObject(key, list);
if (ms.getStatementType() == StatementType.CALLABLE) {
localOutputParameterCache.putObject(key, parameter);
}
return list;
}
}