模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)
模板方法模式
- 一、模板方法模式的概念和角色
- (一)、模板方法模式的概念
- (二)、模板方法模式的角色
- 二、模板方法模式的应用场景
- 三、 模板方法模式的代码示例
- 四、模板方法模式重构JDBC操作业务
- 五、模板方法模式的优缺点
- (一)、优点
- (二)、缺点
- 六、设计模式的相关博客文章链接
- 1、七大设计原则的简单解释(包含合成复用原则),简单理解、快速入门,具备案例代码
- 2、工厂模式详解附有代码案例分析(简单工厂,工厂方法,抽象工厂)
- 3、单例模式详解及代码案例与应用场景(饿汉式单例模式、懒汉式单例模式、注册式单例模式)
- 4、原型模式详解附有代码案例分析(浅克隆和深克隆的相关解析)
- 5、建造者模式详解附有代码案例分析(包含建造者模式与工厂模式的区别分析)
- 6、门面模式详解附有代码案例分析
- 7、装饰者模式详解附有代码案例分析
- 8、享元模式详解附有代码案例分析(包含享元模式的源码应用分析——String中的享元模式应用、Integer中的享元模式应用)
- 9、组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)
- 10、桥接模式详解附有代码案例分析
- 11、适配器模式详解附有代码案例分析(包含类适配器、对象适配器以及接口适配器的代码示例)
- 12、委派模式详解附有代码案例分析(包含委派模式在JDK中的源码示例解析)
- 13、模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)
- 14、策略模式详解附有代码案例分析(包含策略模式在源码中的应用以及代码示例)
- 15、责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例)
- 16、迭代器模式详解附有代码案例分析(包含迭代器模式的源码应用分析)
- 17、命令模式详解附有代码案例分析(包含命令模式的源码应用分析)
- 18、状态模式详解附有代码案例分析(包含状态模式与其他相关设计模式的对比)
- 19、备忘录模式详解附有代码案例分析
- 20、中介者模式详解附有代码案例分析
- 21、解释器模式详解附有代码案例分析
- 22、观察者模式详解附有代码案例分析(包含观察者模式使用JDK方式实现)
- 23、访问者模式详解附有代码案例分析
一、模板方法模式的概念和角色
(一)、模板方法模式的概念
模板方法模式是指定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,属于行为型设计模式。
模板方法模式实际上是封装了一个固定流程,该流程由几个步骤组成,具体步骤可以由子类进行不同实现,从而让固定的流程产生不同的结果。模板方法模式非常简单,就是类的继承机制。但是它确实一个应用非常广泛的模式。模板方法模式的本质是抽象封装流程,具体进行实现。
(二)、模板方法模式的角色
抽象模板(AbstractClass):抽象模板类,定义了一套算法框架/流程
具体实现(ConcreteClass):具体实现类,对算法框架/流程的某些步骤进行了实现。
二、模板方法模式的应用场景
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
2、各子类中公共的行为被提取除了并集中在一个公共的父类中,从而避免代码重复。
三、 模板方法模式的代码示例
该示例中出现的钩子方法的主要目的是用来干预执行流程,使得我们控制行为更加灵活,更加符合实际业务的需求。
钩子方法的返回值一般为适合条件分支语句的返回值(boolean,int等)
AbstractCook:
public abstract class AbstractCook {public final void create() {cutUpVegetables();stirFry();eat();if (needWashDishes()) {washDishes();}}protected void cutUpVegetables() {System.out.println("切菜");}protected void stirFry() {System.out.println("炒菜");}protected void eat() {System.out.println("吃");}// 钩子方法protected boolean needWashDishes() {return false;}protected abstract void washDishes();
}
ACook:
public class ACook extends AbstractCook {private boolean needWashDishes = false;public void setNeedWash(boolean needWashDishes) {this.needWashDishes = needWashDishes;}@Overrideprotected boolean needWashDishes() {return this.needWashDishes;}@Overrideprotected void washDishes() {System.out.println("A洗碗");}
}
BCook:
public class BCook extends AbstractCook {@Overrideprotected void washDishes(){System.out.println("B洗碗");}}
测试类:
public class Test {public static void main(String[] args) {System.out.println("====A====");ACook a = new ACook();a.setNeedWash(true);a.create();System.out.println("====B====");BCook b = new BCook();b.create();}
}
四、模板方法模式重构JDBC操作业务
RowMapper:
public interface RowMapper<T> {T mapRow(ResultSet rs, int rowNum) throws Exception;
}
JdbcTmplate:
public abstract class JdbcTmplate {private DataSource dataSource;public JdbcTmplate(DataSource dataSource) {this.dataSource = dataSource;}public final List<?> executeQuery(String sql, RowMapper<?> rowMapper, Object[] values) {try {// 获取连接Connection connection = this.getCononection();// 创建语句集PreparedStatement pstm = this.createPreparseStatement(connection, sql);// 执行语句集ResultSet resultSet = this.executeQuery(pstm, values);// 处理结果集List<?> result = this.parseResultSet(resultSet, rowMapper);// 关闭结果集resultSet.close();// 关闭语句集pstm.close();// 关闭连接connection.close();return result;} catch (Exception e) {e.printStackTrace();}return null;}private List<?> parseResultSet(ResultSet resultSet, RowMapper<?> rowMapper) throws Exception {List<Object> result = new ArrayList<>();int rowNum = 0;while (resultSet.next()) {result.add(rowMapper.mapRow(resultSet, rowNum++));}return result;}private ResultSet executeQuery(PreparedStatement pstm, Object[] values) throws SQLException {for (int i = 0; i < values.length; i++) {pstm.setObject(i, values[i]);}return pstm.executeQuery();}private PreparedStatement createPreparseStatement(Connection connection, String sql) throws SQLException {return connection.prepareStatement(sql);}private Connection getCononection() throws SQLException {return this.dataSource.getConnection();}
}
Member:
public class Member {private String name;private String password;private String addr;private int age;public Member() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
MemberDao:
public class MemberDao extends JdbcTmplate {public MemberDao(DataSource dataSource) {super(dataSource);}public List<?> selectAll() {String sql = "select * from member";return super.executeQuery(sql, new RowMapper<Member>() {@Overridepublic Member mapRow(ResultSet rs, int rowNum) throws Exception {Member member = new Member();member.setName(rs.getString("name"));member.setAddr(rs.getString("addr"));member.setPassword(rs.getString("password"));member.setAge(rs.getInt("age"));return member;}}, null);}
}
测试类:
public class Test {public static void main(String[] args) {MemberDao memberDao = new MemberDao(null);List<?> result = memberDao.selectAll();System.out.println(result);}
}
五、模板方法模式的优缺点
(一)、优点
1、利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。
2、将不同的代码不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性。
3、把不变的行为写在父类上,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。
(二)、缺点
1、类数目的增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加。
2、类数量的增加,间接地增加了系统实现的复杂度。
3、继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要改一遍。
六、设计模式的相关博客文章链接
1、七大设计原则的简单解释(包含合成复用原则),简单理解、快速入门,具备案例代码
链接: 七大设计原则的简单解释(包含合成复用原则),简单理解、快速入门,具备案例代码.
2、工厂模式详解附有代码案例分析(简单工厂,工厂方法,抽象工厂)
链接: 工厂模式详解附有代码案例分析(简单工厂,工厂方法,抽象工厂).
3、单例模式详解及代码案例与应用场景(饿汉式单例模式、懒汉式单例模式、注册式单例模式)
链接: 单例模式详解及代码案例与应用场景(饿汉式单例模式、懒汉式单例模式、注册式单例模式).
4、原型模式详解附有代码案例分析(浅克隆和深克隆的相关解析)
链接: 原型模式详解附有代码案例分析(浅克隆和深克隆的相关解析).
5、建造者模式详解附有代码案例分析(包含建造者模式与工厂模式的区别分析)
链接: 建造者模式详解附有代码案例分析(包含建造者模式与工厂模式的区别分析).
6、门面模式详解附有代码案例分析
链接: 门面模式详解附有代码案例分析.
7、装饰者模式详解附有代码案例分析
链接: 装饰者模式详解附有代码案例分析.
8、享元模式详解附有代码案例分析(包含享元模式的源码应用分析——String中的享元模式应用、Integer中的享元模式应用)
链接: 享元模式详解附有代码案例分析(包含享元模式的源码应用分析——String中的享元模式应用、Integer中的享元模式应用).
9、组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)
链接: 组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例).
10、桥接模式详解附有代码案例分析
链接: 桥接模式详解附有代码案例分析.
11、适配器模式详解附有代码案例分析(包含类适配器、对象适配器以及接口适配器的代码示例)
链接: 适配器模式详解附有代码案例分析(包含类适配器、对象适配器以及接口适配器的代码示例).
12、委派模式详解附有代码案例分析(包含委派模式在JDK中的源码示例解析)
链接: 委派模式详解附有代码案例分析(包含委派模式在JDK中的源码示例解析).
13、模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)
链接: 模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例).
14、策略模式详解附有代码案例分析(包含策略模式在源码中的应用以及代码示例)
链接: 策略模式详解附有代码案例分析(包含策略模式在源码中的应用以及代码示例).
15、责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例)
链接: 责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例).
16、迭代器模式详解附有代码案例分析(包含迭代器模式的源码应用分析)
链接: 迭代器模式详解附有代码案例分析(包含迭代器模式的源码应用分析).
17、命令模式详解附有代码案例分析(包含命令模式的源码应用分析)
链接: 命令模式详解附有代码案例分析(包含命令模式的源码应用分析).
18、状态模式详解附有代码案例分析(包含状态模式与其他相关设计模式的对比)
链接: 状态模式详解附有代码案例分析(包含状态模式与其他相关设计模式的对比).
19、备忘录模式详解附有代码案例分析
链接: 备忘录模式详解附有代码案例分析.
20、中介者模式详解附有代码案例分析
链接: 中介者模式详解附有代码案例分析.
21、解释器模式详解附有代码案例分析
链接: 解释器模式详解附有代码案例分析.
22、观察者模式详解附有代码案例分析(包含观察者模式使用JDK方式实现)
链接: 观察者模式详解附有代码案例分析(包含观察者模式使用JDK方式实现).
23、访问者模式详解附有代码案例分析
链接: 访问者模式详解附有代码案例分析.
模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)相关推荐
- 组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)
组合模式 一.组合模式的概念和角色 (一).组合模式的概念 (二).组合模式的角色 二.组合模式的应用场景 三.透明组合模式的代码示例 四.安全组合模式的代码示例 五.组合模式的优缺点 (一).优点 ...
- 【设计模式】第十三章:模板方法模式详解及应用案例
系列文章 [设计模式]七大设计原则 [设计模式]第一章:单例模式 [设计模式]第二章:工厂模式 [设计模式]第三章:建造者模式 [设计模式]第四章:原型模式 [设计模式]第五章:适配器模式 [设计模式 ...
- BOT、BT、TOT、TBT和PPP投融资模式详解——交通PPP案例
1 PPP 20世纪90年代后,一种崭新的融资模式-PPP模式(Public-Private-Partnership,即"公共部门-私人企业-合作"的模式)在西方特别是欧洲流行起来 ...
- VMware虚拟机三种网络模式详解(一)Bridged(桥接模式)
由于Linux目前很热门,越来越多的人在学习Linux,但是买一台服务放家里来学习,实在是很浪费.那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有VMware Workstations ...
- 索引超出矩阵维度_搜索引擎技术之倒排索引原理详解,及案例分析
1.倒排索引的思想 2."单词-文档矩阵" 3.倒排索引的基本框架 4.单词字典 5.倒排索引的实例 倒排索引是搜索引擎中最为核心的一项技术之一,可以说是搜索引擎的基石.可以说正是 ...
- 显存文本模式详解 ———《x86汇编语言:从实模式到保护模式》读书笔记补遗02
文章修改记录 修改日期 修改内容 2018-2-4 修改了一处错别字:增加了表格的使用方法 今天我们讨论如何编程以在屏幕上显示出彩色的文字. 为了显示文字,通常需要两种硬件--显示器和显卡. 显卡的作 ...
- 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)
设计模式之生成器模式(对象创建型模式) 1.定义/概念 将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示. 2.生成模式角色 Builder: 生成器接口,定义创建一个Produ ...
- 九、委派模式与模板模式详解
14.委派模式 14.1.课程目标 1 .掌握委派模式, 精简程序逻辑, 提升代码的可读性. 2.学会用模板方法模式梳理使用工作中流程标准化的业务场景. 14.2.内容定位 1 .希望通过对委派模式的 ...
- 设计模式之装饰器模式详解
设计模式之装饰器模式详解 文章目录 设计模式之装饰器模式详解 一.什么是装饰器模式 二.装饰器模式的角色组成 三.装饰器模式通用写法示例 四.装饰器模式业务中的应用举例 五.装饰器模式优缺点 一.什么 ...
最新文章
- Android异步下载网络图片(其二:AsyncTask)
- steam一键授权工具_半个东的时间让你省了一个亿 Steam免费游戏一键领取
- 函数 getaddrinfo 学习
- Guava库学习:学习Concurrency(二)Monitor_2
- Python 之如何暴力破解加密文件
- 95后CEO讲述创业“邮件经”
- 浏览器清理缓存的几种方法
- centos mysql5.6卸载_centos 卸载mysql
- SHOI 2008 仙人掌图 BZOJ 1023
- 三相维也纳pfc,开关电源,三相AC输入无桥pfc±400vDC输出,已经量产两年非常成熟,包括源代码
- 格林尼治标准时(GMT)与世界时(UTC)
- 鼠标参数以及选购DPI和报告率
- 表格td的宽度不随内容自适应
- ppt文字转换成word
- 软工大作业·倾物语(三)
- CAD dxflib 圆弧的标注
- 苹果恢复大师能正确使用时的各个软件版本
- DeepGBM: A Deep Learning Framework Distilled by GBDT for Online Prediction Tasks
- 网上商城电子购物网站
- abaqus编写本构方程vumat_基于Abaqus子程序的高分子材料本构关系实现