先来看JDK 中的AbstractList,来看代码:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {public abstract E get(int var1);
}

我们看到get()是一个抽象方法,那么它的逻辑就是交给子类来实现,我们大家所熟知的ArrayList 就是AbstractList 的子类。同理, 有AbstractList 就有AbstractSet 和AbstractMap,有兴趣的小伙伴可以去看看这些的源码实现。还有一个每天都在用的HttpServlet,有三个方法service()和doGet()、doPost()方法,都是模板方法的抽象实现。

在MyBatis 框架也有一些经典的应用,我们来一下BaseExecutor 类,它是一个基础的SQL 执行类,实现了大部分的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;protected abstract <E> Cursor<E> doQueryCursor(MappedStatement var1, Object var2, RowBounds var3,BoundSql var4) throws SQLException;...
}

如doUpdate、doFlushStatements、doQuery、doQueryCursor 这几个方法就是交由子类来实现,那么BaseExecutor 有哪些子类呢?我们来看一下它的类图:

我们一起来看一下SimpleExecutor 的doUpdate 实现:

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;
}

再来对比一下BatchExecutor 的doUpate 实现:

public int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException {Configuration configuration = ms.getConfiguration();StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, (ResultHandler)null, (BoundSql)null);BoundSql boundSql = handler.getBoundSql();String sql = boundSql.getSql();Statement stmt;if (sql.equals(this.currentSql) && ms.equals(this.currentStatement)) {int last = this.statementList.size() - 1;stmt = (Statement)this.statementList.get(last);this.applyTransactionTimeout(stmt);handler.parameterize(stmt);BatchResult batchResult = (BatchResult)this.batchResultList.get(last);batchResult.addParameterObject(parameterObject);} else {Connection connection = this.getConnection(ms.getStatementLog());stmt = handler.prepare(connection, this.transaction.getTimeout());handler.parameterize(stmt);this.currentSql = sql;this.currentStatement = ms;this.statementList.add(stmt);this.batchResultList.add(new BatchResult(ms, sql, parameterObject));}handler.batch(stmt);return -2147482646;
}

细心的小伙伴一定看出来了差异。当然,我们在这里就暂时不对MyBatis 源码进行深入分析。

模板模式在源码中的体现相关推荐

  1. 【设计模式系列20】解释器模式原理及其在JDK和Spring源码中的体现

    解释器模式原理及其在JDK源码中的体现 设计模式系列总览 前言 什么是解释器模式 终结符表达式和非终结符表达式 解释器模式示例 解释器模式角色 解释器模式在JDK和Spring源码中应用 解释器模式应 ...

  2. 装饰者模式在源码中的应用

    装饰器模式在源码中也应用得非常多,在JDK 中体现最明显的类就是IO 相关的类,如BufferedReader.InputStream.OutputStream,看一下常用的InputStream 的 ...

  3. 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用

    文章目录 1. 责任链模式 1.1 责任链模式简介 1.2 责任链模式结构 1.3 责任链模式示例 2. 责任链模式在源码中的应用 2.1 Servlet 中的责任链模式 2.2 Spring 中的责 ...

  4. 策略模式在JDK 源码中的体现

    首先来看一个比较常用的比较器Comparator 接口,我们看到的一个大家常用的compare()方法,就是一个策略抽象实现: Comparator 抽象下面有非常多的实现类,我们经常会把Compar ...

  5. 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式

    文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...

  6. android 指令模式,Android 源码中的命令模式

    原标题:Android 源码中的命令模式 (点击上方公众号,可快速关注) 来源:伯乐在线专栏作者 - PleaseCallMeCoder 链接:http://android.jobbole.com/8 ...

  7. 快速理解工厂方法模式,及其在源码中的应用

    (一).什么是工厂方法模式 有一个总工厂负责生产各种电视产品,此时来了一个生产小米电视的需求,就会分配出一个制作小米电视的工厂,然后就能用该工厂生产小米电视了. 上面这种通过工厂来实例化类的方式抽象到 ...

  8. 装饰器模式在MyBatis以及Spring源码中的应用

    结构型模式                 ----顺口溜:适装桥组享代外 目录 1.装饰器模式 1.1 装饰器模式UML图 1.2 日常生活中看装饰器模式 1.3 使用场景 1.4 Java代码实现 ...

  9. 13-MyBatis 使用了哪些设计模式?在源码中是如何体现的?

    MyBatis 的前身是 IBatis,IBatis 是由 Internet 和 Abatis 组合而成,其目的是想当做互联网的篱笆墙,围绕着数据库提供持久化服务的一个框架,2010 年正式改名为 M ...

最新文章

  1. server2016 查看图片 预览图片
  2. spark ui_Spark UI的见解
  3. MySQL的索引优化
  4. VC中ADO连接SQLSERVER的几种标准方式?
  5. Python笔记-假设检验之双样本T检验(两样本是否相似)
  6. 车厢调度(信息学奥赛一本通-T1357)
  7. python jupyter
  8. sqlplus连接Oracle的正确语法
  9. CHM电子书木马制作攻略
  10. krpano1.20版本正式发布!
  11. 编写python程序按照单利方式计算理财产品收益
  12. 「SQL数据分析系列」4.过滤操作
  13. 区块链APP怎么开发?深入分析
  14. cocos2d-x下硬件音量按键控制游戏音量的实现
  15. 桌面计算机网络图标不见了怎么办,桌面图标不见了怎么办?这里有妙招
  16. 获取linux系统序列号
  17. 机器学习笔记之受限玻尔兹曼机(四)推断任务——边缘概率
  18. 在deepin上如何打开PowerDesigner文件或者pdm文件
  19. 行业研究报告-全球与中国室内设计师3D可视化软件市场现状及未来发展趋势
  20. OpenGL Blend

热门文章

  1. java程序员高薪持续的原因有哪些
  2. Centos 7安装与配置chef
  3. DM8168 新三板系统启动
  4. 2012_Houdini_ShowReel.
  5. 自百度2012吧——这些都是巧合吗
  6. 并发编程之Synchronized
  7. 使用supervisor启动hbase
  8. 【转】ubuntu,你改变了我的人生
  9. 最近面试,笔试题中的一道sql题
  10. JAVA面试题解惑系列(四)——final、finally和finalize的区别