1、模板设计模式
赵本山问宋丹丹: “如何把大象放进冰箱?”宋丹丹回答:“第一步:打开冰箱门,第二步:把大象塞进 冰箱,第三步:关闭冰箱门”。赵本山再问:“怎么把长劲鹿放进冰箱?”宋丹丹答: “第一步:打开冰箱门,第二步:把大象拿出来,第三步:把长劲鹿塞进去,第四步: 关闭冰箱门”(如下图所示),这些都是模板模式的体现。
模板设计模式通常又叫做模板方法设计模式,是指定义个算法骨架,允许子类为一个或者多个步骤提供实现。模板方法使得子类在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为设计模式。
适用场景:
(1)一次性实现算法的不变部分,将可变的部分留给子类实现;
(2)各个子类中提取出公共行为,向上提取到公共的父类中,从而实现 代码复用。
模板模式在经典框架mybaties中的的应用:
BaseExecutor是一个基础类,实现了大部分的SQL实行流程和逻辑,如获取事物、关闭连接等,将处理不同的细节抽象,交给子类实现,下面是子类需要试下的抽象方法。
public abstract class BaseExecutor implements Executor {
protected abstract int doUpdate(MappedStatement var1, Object var2) throws SQLException;
protected abstract List<BatchResult> doFlushStatements(boolean var1) throws SQLException;
protected abstract <E> List<E> doQuery(MappedStatement var1, Object var2, RowBounds var3, ResultHandler var4, BoundSql var5) throws SQLException;
}
下面看看BaseExecutor的子类有那些?
下面看看doUpdate方法的实现
public class SimpleExecutor extends BaseExecutor {
public SimpleExecutor(Configuration configuration, Transaction transaction) {
super(configuration, transaction);
}
public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
Statement stmt = null;
int var6;
try {
Configuration configuration = ms.getConfiguration();
StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, (ResultHandler)null, (BoundSql)null);
stmt = this.prepareStatement(handler, ms.getStatementLog());
var6 = handler.update(stmt);
} finally {
this.closeStatement(stmt);
}
return var6;
}
.................
}
public class BatchExecutor extends BaseExecutor {
public static final int BATCH_UPDATE_RETURN_VALUE = -2147482646;
private final List<Statement> statementList = new ArrayList();
private final List<Batch