JAVA设计模式之-模板方法+(钩子函数)
1.定义
允许子类对父类的一个或多个步骤进行重写。例如聚合支付场景中有很多共同的步骤,比如验签、四要素验证、风控等等,但是在支付的时候走不同的渠道可能在调用和参数上有很大的不同,比如有的是xml,有的是json,等等。 我们就可以用父类实现通用的逻辑,由子类实现不同的交互逻辑。
2.模板方法+钩子函数示例
顶层接口 BasePay
public interface BasePay {
//移动支付
void mobilePay();
}
抽象类 AbstractBasePay
public abstract class AbstractBasePay implements BasePay { @Override
public final void mobilePay() {
// 钩子函数
if (isCheckAuth()) {
checkAuth();
}
checkParam();
chenckRisk();
channlPay();
} private void checkParam() {
System.out.println("检查参数");
} private void checkAuth() {
System.out.println("支付权限校验");
} private void chenckRisk() {
System.out.println("风控校验");
} //渠道支付
abstract void channlPay(); //钩子函数,子类可以覆写,来选择手开启支付权限校验 默认不开启
boolean isCheckAuth() {
return true;
}
}
具体实现 1 中金支付
public class CPCNchannelPay extends AbstractBasePay{ @Override
void channlPay() {
System.out.println("中金支付");
} boolean isCheckAuth() {
return false;
}
}
具体实现2 阿里支付
public class AliChannelPay extends AbstractBasePay{ @Override
void channlPay() {
System.out.println("阿里pay");
} }
运行及结果
public class TestPay {
public static void main(String[] args) {
System.out.println("--中金支付start");
BasePay pay1 = new CPCNchannelPay();
pay1.mobilePay();
System.out.println("--中金支付end"); System.out.println("--阿里paystart");
BasePay pay2 = new AliChannelPay();
pay2.mobilePay();
System.out.println("--阿里payend"); }
}
结果:
--中金支付start
检查参数
风控校验
中金支付
--中金支付end --阿里paystart
支付权限校验
检查参数
风控校验
阿里pay
--阿里payend
我们可以看到中金支付中,我们把钩子返回设置成了false ,就没有进行支付权限校验
4.模板方法在框架源码中的应用
比如mybatis 对于入参设值,和返回参数映射成实体类时的类型转换,就是用的模板方法。
类图如下:
aaarticlea/png;base64,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" alt="">
说明:
① TypeHandler接口
这个接口有三个方法,一个set,用来给PreparedStatement对象对应的列设置参数;两个get,从ResultSet和CallableStatement获取对应列的值,不同之处是一个是取第几个位置的值,一个是取具体列名所对应的值。set用来将Java对象中的数据类型转换为JDBC中对应的数据类型,get用来将JDBC中对应的数据类型转换为Java对象中的数据类型转换。
②BaseTypeHandler抽象类
在进行软件设计时提倡面向接口的设计,但接口只是一个接口,并不做任何实质性的操作,还需有一系列的实现才可以真正的达到目标。BaseTypeHandler类便是对TypeHandler接口的初步实现,在实现TypeHandler接口的三个函数外,又引入了3个抽象函数用于null值的处理。
④DateTypeHandler
书接上文,BaseTypeHandler类也是一个抽象类,按照Java的规定抽象类并不能初始化,也不能直接使用,因而还需要有具体的类。在type包中有十多个具体的类来具体处理类型转换,每一个类处理一个数据类型,像long、int、double等等,我们以一个稍微复杂些的DateTypeHandler类为例,了解下对日期是如何进行处理的。
1)setNonNullParameter
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType)
throws SQLException {
ps.setTimestamp(i, new java.sql.Timestamp(((Date) parameter).getTime()));
}
首先将参数parameter这个Object转换为Date类型,而后通过Date对象的getTime()将日期转为毫秒数,而后再将毫秒数转换为java.sql.Timestamp对象。即将java.util.Date对象转换为java.sql.Timestamp对象。
2)getNullableResult
public Object getNullableResult(ResultSet rs, String columnName)
throws SQLException {
java.sql.Timestamp sqlTimestamp = rs.getTimestamp(columnName);
if (sqlTimestamp != null) {
return new java.util.Date(sqlTimestamp.getTime());
}
return null;
} public Object getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
java.sql.Timestamp sqlTimestamp = cs.getTimestamp(columnIndex);
if (sqlTimestamp != null) {
return new java.util.Date(sqlTimestamp.getTime());
}
return null;
}
从上面的代码可以看出这两个函数的作用就是将 java.sql.Timestamp对象转换为 java.util.Date对象.
1)setNonNullParameter
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType)
throws SQLException {
ps.setTimestamp(i, new java.sql.Timestamp(((Date) parameter).getTime()));
}
首先将参数parameter这个Object转换为Date类型,而后通过Date对象的getTime()将日期转为毫秒数,而后再将毫秒数转换为java.sql.Timestamp对象。即将java.util.Date对象转换为java.sql.Timestamp对象。
2)getNullableResult
public Object getNullableResult(ResultSet rs, String columnName)
throws SQLException {
java.sql.Timestamp sqlTimestamp = rs.getTimestamp(columnName);
if (sqlTimestamp != null) {
return new java.util.Date(sqlTimestamp.getTime());
}
return null;
} public Object getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
java.sql.Timestamp sqlTimestamp = cs.getTimestamp(columnIndex);
if (sqlTimestamp != null) {
return new java.util.Date(sqlTimestamp.getTime());
}
return null;
}
从上面的代码可以看出这两个函数的作用就是将 java.sql.Timestamp对象转换为 java.util.Date对象.
参考博客:https://www.cnblogs.com/sunzhenchao/archive/2013/04/09/3009431.html
JAVA设计模式之-模板方法+(钩子函数)的更多相关文章
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- java 设计模式之模板方法
模板方法的定义 定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现. 模板方法使得子类在不改变算法结构的情况下,重新定义某些算法的步骤. 一次性实现一个算法不变的部分,把可变的行为留给子类实现. ...
- Java设计模式应用——模板方法模式
所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...
- [译]Java 设计模式 之模板方法
(文章翻译自Java Design Pattern: Template Method) 模板方法设计模式定义了归档特定操作的工作流.它允许子类去修改特定的步奏而不用改变工作流的结构. 下面的例子表示模 ...
- Java设计模式之模板方法设计模式(银行计息案例)
不知道为什么,这几天对Java中的设计模式非常感兴趣,恰巧呢这几天公司的开发任务还不算太多,趁着有时间昨天又把模板方法模式深入学习了一下,做了一个客户在不同银行计息的小案例,感触颇深,今天给各位分享一 ...
- java设计模式之模板方法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8744002 今天你还是像往常一样来上班,一如既往地开始了你的编程工作. 项目经理告 ...
- Java设计模式之 — 模板方法(Template Method)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8744002 今天你还是像往常一样来上班,一如既往地开始了你的编程工作. 项目经理告 ...
- Java设计模式之模板方法模式(Template)
前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...
- java设计模式之模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...
随机推荐
- SHELL用法九(awk练习)
1.SHELL编程Awk语句案例实战 Awk主要是用于对文本文件进行处理,通常是逐行处理,其语法参数格式为, AWK常用参数.变量.函数详解如下: awk 'pattern + {action}' f ...
- 《hdu 免费馅饼》
题目描述 免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- Java IO: ByteArray和Filter
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中字节数组与过滤器的输入输出流,主要涉及以下4个类型的流:ByteArr ...
- 简单了解char和varchar的区别
一.CHAR和 VARCHAR的区别? 1.CHAR有固定的长度,VARCHAR属于可变长度的字符类型. 2.比如,写入内容到CHAR(10)里,如果内容占用的空间不够10,则会用空格字符补足. 二. ...
- Eclipse添加comment
1.给新增的Java类,自动生成Comment. 打开Preferences,找到Java-->Code Style -->Code Templates-->Comments--&g ...
- MySQL数据类型(DATA Type)与数据恢复与备份方法
一.数据类型(DATA Type)概述 MySQL支持多种类型的SQL数据类型:数字类型,日期和时间类型,字符串(字符和字节)类型以及空间类型 数据类型描述使用以下约定: M表示整数类型的最大显示宽度 ...
- 浅谈JobExecutionContext & JobDataMap
JobExecutionContext是什么? 当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的 execute() 方法: Job能通过JobExecu ...
- Mac Webstrom 快捷键
C + D 删除当前行 光标所在行 S + C + F 格式化 S + C + R 重命名 C + { 查找上次 C + } 查找下次 C + S + DE 回到上一次编程位置 C + F 查找 C ...
- 2019DDCTF部分Writeup
-- re Windows Reverse1 通过DIE查壳发现存在upx,在linux上upx -d脱壳即可,拖入IDA,通过关键字符串找到关键函数: main函数中也没有什么,将输入的字符串带到s ...
- C2C的道德边界:沦为从假运单到假病条的供假渠道
你可能刚开始学会不去看网购平台上商品回评中的虚假好评,却又要开始应对同事在朋友圈等平台买来的虚开病假条带来的困扰.最近各大媒体包括党报热传的网购病假条事件,再度将人们的目光集中在这个C2C模式之上.从 ...