模板模式在源码中的体现
先来看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 源码进行深入分析。
模板模式在源码中的体现相关推荐
- 【设计模式系列20】解释器模式原理及其在JDK和Spring源码中的体现
解释器模式原理及其在JDK源码中的体现 设计模式系列总览 前言 什么是解释器模式 终结符表达式和非终结符表达式 解释器模式示例 解释器模式角色 解释器模式在JDK和Spring源码中应用 解释器模式应 ...
- 装饰者模式在源码中的应用
装饰器模式在源码中也应用得非常多,在JDK 中体现最明显的类就是IO 相关的类,如BufferedReader.InputStream.OutputStream,看一下常用的InputStream 的 ...
- 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用
文章目录 1. 责任链模式 1.1 责任链模式简介 1.2 责任链模式结构 1.3 责任链模式示例 2. 责任链模式在源码中的应用 2.1 Servlet 中的责任链模式 2.2 Spring 中的责 ...
- 策略模式在JDK 源码中的体现
首先来看一个比较常用的比较器Comparator 接口,我们看到的一个大家常用的compare()方法,就是一个策略抽象实现: Comparator 抽象下面有非常多的实现类,我们经常会把Compar ...
- 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式
文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...
- android 指令模式,Android 源码中的命令模式
原标题:Android 源码中的命令模式 (点击上方公众号,可快速关注) 来源:伯乐在线专栏作者 - PleaseCallMeCoder 链接:http://android.jobbole.com/8 ...
- 快速理解工厂方法模式,及其在源码中的应用
(一).什么是工厂方法模式 有一个总工厂负责生产各种电视产品,此时来了一个生产小米电视的需求,就会分配出一个制作小米电视的工厂,然后就能用该工厂生产小米电视了. 上面这种通过工厂来实例化类的方式抽象到 ...
- 装饰器模式在MyBatis以及Spring源码中的应用
结构型模式 ----顺口溜:适装桥组享代外 目录 1.装饰器模式 1.1 装饰器模式UML图 1.2 日常生活中看装饰器模式 1.3 使用场景 1.4 Java代码实现 ...
- 13-MyBatis 使用了哪些设计模式?在源码中是如何体现的?
MyBatis 的前身是 IBatis,IBatis 是由 Internet 和 Abatis 组合而成,其目的是想当做互联网的篱笆墙,围绕着数据库提供持久化服务的一个框架,2010 年正式改名为 M ...
最新文章
- server2016 查看图片 预览图片
- spark ui_Spark UI的见解
- MySQL的索引优化
- VC中ADO连接SQLSERVER的几种标准方式?
- Python笔记-假设检验之双样本T检验(两样本是否相似)
- 车厢调度(信息学奥赛一本通-T1357)
- python jupyter
- sqlplus连接Oracle的正确语法
- CHM电子书木马制作攻略
- krpano1.20版本正式发布!
- 编写python程序按照单利方式计算理财产品收益
- 「SQL数据分析系列」4.过滤操作
- 区块链APP怎么开发?深入分析
- cocos2d-x下硬件音量按键控制游戏音量的实现
- 桌面计算机网络图标不见了怎么办,桌面图标不见了怎么办?这里有妙招
- 获取linux系统序列号
- 机器学习笔记之受限玻尔兹曼机(四)推断任务——边缘概率
- 在deepin上如何打开PowerDesigner文件或者pdm文件
- 行业研究报告-全球与中国室内设计师3D可视化软件市场现状及未来发展趋势
- OpenGL Blend