设计模式 – 模板设计模式

article/2025/10/25 2:36:04

模板设计模式

模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

该模式的主要优点如下。
1) 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
2) 它在父类中提取了公共的部分代码,便于代码复用。
3) 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

案例

JdbcTemplate uml 图:
在这里插入图片描述

1 pom

 <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency></dependencies>

2 JdbcFactory

import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;public class JdbcFactory {/*** ###########################DB配置########################*/private static final String URL = "jdbc:mysql://localhost:3306/test?charset=utf8mb4&serverTimezone=UTC&useUnicode=true&useSSL=false";private static final String USERNAME = "root";private static final String PASSWORD = "123456";private static final String DRIVER = "com.mysql.jdbc.Driver";private static DataSource db;static {Map<String, String> map = new HashMap<>();map.put(DruidDataSourceFactory.PROP_DRIVERCLASSNAME, DRIVER);map.put(DruidDataSourceFactory.PROP_URL, URL);map.put(DruidDataSourceFactory.PROP_USERNAME, USERNAME);map.put(DruidDataSourceFactory.PROP_PASSWORD, PASSWORD);try {db = DruidDataSourceFactory.createDataSource(map);} catch (Exception e) {db = null;e.printStackTrace();}}private JdbcFactory() {}public static DataSource getInstance() {return db;}}

3 RowMapper


/*** ORM 定制化接口*/
public interface RowMapper<T> {T mapRow(ResultSet rs, int rowNum) throws SQLException;}

4 JdbcTemplate

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public abstract class JdbcTemplate {private DataSource dataSource;public JdbcTemplate(DataSource dateSource) {this.dataSource = dateSource;}public <T> List<T> executeQuery(String sql, RowMapper<T> rowMapper, Object[] values) {try {//1 获取连接Connection connection = this.getConnection();//2 创建语句集PreparedStatement pstm = this.createPrepareStatement(connection, sql);//3 执行语句集ResultSet rs = execute(pstm, values);//4 处理结果集List<T> list = paresResultSet(rs, rowMapper);//5 关闭结果集this.closeResultSet(rs);//6 关闭语句集this.closeStatement(pstm);//7 关闭连接this.closeConnection(connection);//8 返回return list;} catch (Exception e) {e.printStackTrace();}return new ArrayList<>();}protected void closeConnection(Connection connection) throws SQLException {if (connection != null) {connection.close();}}protected void closeStatement(PreparedStatement pstm) throws SQLException {pstm.close();}protected void closeResultSet(ResultSet rs) throws SQLException {rs.close();}protected <T> List<T> paresResultSet(ResultSet rs, RowMapper<T> rowMapper) throws SQLException {List<T> result = new ArrayList<>();int rowNum = 1;while (rs.next()) {result.add(rowMapper.mapRow(rs, rowNum++));}return result;}private ResultSet execute(PreparedStatement pstm, Object[] values) throws SQLException {if (values != null) {for (int i = 0; i < values.length; i++) {pstm.setObject(i, values[i]);}}return pstm.executeQuery();}protected PreparedStatement createPrepareStatement(Connection connection, String sql) throws SQLException {return connection.prepareStatement(sql);}private Connection getConnection() throws SQLException {return this.dataSource.getConnection();}}

5 业务类

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {private Integer id;private String name;private Integer age;}public class StudentDao extends JdbcTemplate {public StudentDao(DataSource dateSource) {super(dateSource);}public List<Student> selectAll() {String sql = "select * from t_student";return super.executeQuery(sql, (rs, rowNum) -> {Student student = new Student();student.setId(rs.getInt("id"));student.setAge(rs.getInt("age"));student.setName(rs.getString("name"));return student;}, null);}}

6 测试

public class JdbcTest {public static void main(String[] args) throws Exception {DataSource instance = JdbcFactory.getInstance();StudentDao studentDao=new StudentDao(instance);List<Student> students = studentDao.selectAll();System.out.println(students.toString());}}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/I3LoSS4q.shtml

相关文章

【设计模式】模板模式

博主声明&#xff1a; 转载请在开头附加本文链接及作者信息&#xff0c;并标记为转载。本文由博主 威威喵 原创&#xff0c;请多支持与指教。 本文首发于此 博主&#xff1a;威威喵 | 博客主页&#xff1a;https://blog.csdn.net/smile_running 这是23种设计模式中的模板模…

设计模式之模板模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、模板模式是什么&#xff1f; 模板模式是一种行为型的软件设计模式&#xff0c;在父类中定义了一个模板算法&#xff0c;只实现…

设计模式——模板模式

更多内容&#xff0c;前往 IT-BLOG 在面向对象程序设计过程中&#xff0c;程序员常常会遇到如下情况&#xff1a;设计一个系统时知道算法所需的关键步骤&#xff0c;且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体…

深入理解设计模式之模板模式

我们平时办理入职的流程是&#xff1a;填写入职登记表->打印简历->复印学历->复印身份证->签订劳动合同->建立花名册->办理工牌->安排工位。我平时在家里炒菜的流程是&#xff1a;洗锅->点火->热锅->上油->下原料->翻炒->放调料->出…

数据化风控与催收人员策略管理

在印象中催收也许是个玄学&#xff0c;一个做得好的催收员除了催收技巧外、你需要了解心理学、懂声音学、懂人性、懂风水易经&#xff0c;比如就有个认识的人对什么岁数的人在哪个时辰拨打电话才比较好&#xff0c;都有讲究…总之一切尽在不言中… 但催收的管理却与之相反&…

信贷产品年终总结之风控评分模型

叮咚&#xff0c;信贷年终总结的又一个专题来了&#xff0c;作为报告总结类的系列型文章&#xff0c;近期我们番茄知识星球平台陆续发布了相关年终总结专题&#xff0c;依次为客群特征画像、贷中行为分析、贷后逾期表现等&#xff0c;以上文章可详见之前陆续发布的内容。该业务…

实操信贷场景中的反欺诈模型

今天的文章&#xff0c;关于反欺诈模型的实操&#xff0c;之前有跟大家分享过相关内容&#xff0c;部分反欺诈的领域的童鞋感觉内容比较有帮助&#xff0c;今天就该内容进行讲解。本文介绍的产品适合在消费零售信贷及现金场景贷中的中短期产品&#xff0c;其中涉及的变量参考有…

信贷全生命周期监控报表开发

对于任何一家从事信贷业务的机构而言&#xff0c;监控报表的设计及搭建尤为重要。因为监控报表不仅涉及信贷风控的资产监控&#xff0c;更能反馈客群质量的变化、内部管理手段的调整、策略规则对客群质量的影响等方面。为此&#xff0c;番茄风控输出此系列文章&#xff0c;我们…

信贷全流程监控报表有哪些?

风险策略分析工作是风险管理的重要工作内容&#xff0c;其工作内容需要涉及风控领域中多个环节及细节内容&#xff0c;包含贷前策略调整、策略分析调优、贷中业务监控、贷后策略调整等模块内容&#xff0c;涉及相关模块工作细节及工作内容&#xff0c;我们将一一为大家梳理及分…

详解小微机构贷前准入规则

关注 “番茄风控大数据”&#xff0c;获取更多数据分析与风控大数据的实用干货 嗨同学们好&#xff0c;现在疫情的情况已经出现大反转&#xff0c;我们国内的疫情已经控制住&#xff0c;多个城市都出现了连续多年0增长&#xff0c;一二线城市的部分公共场合也陆续对外开放&…

催收评分卡是如何搭建的?

1、背景 在整个风控体系中&#xff0c;一般分为贷前、贷中和贷后&#xff0c;贷前一般包括反欺诈和A卡&#xff0c;贷中一般使用B卡&#xff0c;贷后一般使用C卡&#xff0c;随着现在监管的越来越严格&#xff0c;催收的合规性越来越重要&#xff0c;所以各持牌金融机构越来越…

贷款中介业务管理系统-具备完善的贷前审批及贷后监管功能

一、系统介绍 银行贷款中介平台&#xff08;助保贷平台&#xff09;是一套适用于当今时代的中介系统&#xff0c;对于借款人来说可以满足他们上学、培训、旅游、购物等。平台根据各借款人资质推介给各银行或用自有资金放款。贷款中介系统提供了一套完善的网络借贷系统&#xff…

一文带你了解助贷行业

原文作者&#xff1a;宁阿姨&#xff08;知乎ID&#xff09; 原文链接&#xff1a;https://zhuanlan.zhihu.com/p/485880345 注&#xff1a;仅限自己学习使用 日常消费用花呗用信用卡&#xff0c;个人周转用借呗或微粒贷&#xff0c;买车买房用车贷房贷&#xff0c;作为消费者…

贷后催收中的风险联动管控指标

在番茄风控大数据之前的文章中&#xff0c;之前跟大家介绍过催收相关内容&#xff1a;催收小词典&#xff0c;助你轻松讨回债务。 今天文章会再跟大家介绍在这些催收指标中&#xff0c;哪些指标是可以反馈到贷前贷中风控环节的。在策略整体优化流程而言&#xff0c;数据是流动…

现金贷、信用贷、消费贷小贷系统后台、现金贷、消费贷、信用贷、助学贷、旅游贷、装修贷、准入授信 、贷款申请、产品授信、合同管理、放款审批、放款登记、还款管理、贷后检查、贷后预警、贷款结项、Axure原型

现金贷、信用贷、消费贷小贷系统后台、现金贷、消费贷、信用贷、助学贷、旅游贷、装修贷、准入授信 、贷款申请、产品授信、合同管理、放款审批、放款登记、还款管理、贷后检查、贷后预警、贷款结项、 Axure原型演示及下载地址&#xff1a;Axure Cloud - Generating Project …

什么是银行测试业务?银行测试业务包括哪些?

我们知道软件测试是为了保证软件的质量和可靠性而在新软件系统上线之前对软件进行的质量检测工作。通过软件测试这个过程找出软件中的错误&#xff0c;分析错误的产生原因和容易产生错误的区域&#xff0c;进而有针对性的设计测试方法提高软件测试的效率。 以上简单讲述了一下…

贷前贷中风控体系

消费金融服务方&#xff1a;金融系、场景系、互联网系 第三方支撑平台&#xff1a;获客平台、风控支持、系统服务、支付平台、贷后管理 消费金融风控全流程 贷前审查&#xff1a;信息采集、信息验证、反欺诈 贷中评估&#xff1a;信用评估、授信 贷后管理&#xff1a;贷后…

贷中管理-理论

Part1 什么是贷中管理 贷中管理&#xff1a;值从贷款发放之日起&#xff0c;至贷款本息收回日期为止的贷款管理。 不同于贷前和贷后管理&#xff0c;贷后管理早期在信贷管理较为薄弱&#xff0c;且没有明确的业务目标。但随着催收压力逐渐加大&#xff0c;且贷中管理存在大量的…

贷前中后简单记录

前中后 贷前贷中贷后是一个业务分类&#xff0c;是用户信贷生命周期的三个阶段。并不是一个业务架构或者技术架构。以下的贷前贷中贷后主要是互金领域的情况&#xff0c;传统银行也有贷前贷中贷后&#xff0c;但是做法不同。 贷前 1、准入/额度/利率 贷前的核心就是两个&am…

艾肯4nano_Utrack_micu_mobile等声卡调试_网络主播防坑必学技能

小伙音频技术专业声卡调音师讲解关于艾肯声卡的调试与选用技巧&#xff0c;防坑必看&#xff01;更多咨询也可关注声卡调试教程论坛 一&#xff1a; 4、6nano&#xff1b; Utrack&#xff1b; micu&#xff1b;mobile &#xff1b; Uporst2/4/6 等这几款支持效果精调 &a…