- 在这里我首先以一个比较简单的小例子让不知道模板模式的人先有个入门的概念。(如果要想深入了解,去看<java与模式>)
- 在后面的例子我将以一个比较实用的例子来说明这种模式给我们带来的好处,并且这个例子很实用。下面我会把所有的代码
- 都贴出来,你可以直接Copy代码就可以运行,如果你已经有啦一定了解,那么就直接看第二个吧。
- 在这里我希望你把它看完,并把它理解。因为开始我在看Spring的源码的时候也是看啦好多次才把思路理清楚的。
- 首先先说说这两个例子的作用,要不然看啦大半天都不知道是什么东西。
- 第一个: 当我们去买东西的时候,东西都会打折,然而每种东西的折扣都不一样。如买Book的时候,书的折扣是 0.8 折
- 而当我们去买 Video 的时候,它是 0.7 折,如果这些分类的商品很多的时候。而我们每次都要 在每一个类
- 中写一个打折后得到的实际价格的话,那是不是感觉到很累赘。也很不爽。所以我们有必要把它抽象出来。那么
- 每个类只要从这个类继承就可以啦。如果重用的方法多的话,那么这就会带来很大的好处.
- 看源代码:
- /*
- * 这是一个模板方法的抽象类,所有的将要打折的商品都要从它继承
- * 那么就会得到getRealPrice()这个模板方法,当然,这里只是为了
- * 说明模板方法的用处
- */
- package com.dongguoh;
- public abstract class Item {
- protected abstract float getUnitPrice();
- protected abstract float getDiscountRate();
- public float getRealPrice(){
- return this.getDiscountRate()*this.getUnitPrice();
- }
- }
- package com.dongguoh;
- public class Video extends Item{
- /*
- * 在实际当中,这些要返回的值应当是从数据库当中去取
- */
- protected float getDiscountRate() {
- return 0.8f;
- }
- protected float getUnitPrice() {
- return 300;
- }
- }
- package com.dongguoh;
- public class Book extends Item {
- /*
- * 在实际当中,这些要返回的值应当是从数据库当中去取
- */
- public float getDiscountRate() {
- return 0.7f;
- }
- public float getUnitPrice() {
- return 88;
- }
- }
- 下面这是测试方法
- package com.dongguoh;
- import java.sql.*;
- import junit.framework.TestCase;
- public class TestTemplate extends TestCase {
- public void testMethod(){
- Book bk=new Book();
- Video vd=new Video();
- System.out.println("BookRealPrice: "+bk.getRealPrice());
- System.out.println("VideoRealPrice: " +vd.getRealPrice());
- }
- }
- 结果:
- BookRealPrice: 61.6
- VideoRealPrice: 240.0
- 上面这个例子比较简单,我就不多说啦,下面的是个实用的例子
- 例子二: 如果不是用Orm工具而是用经常用jdbc操作数据库的人会感到每次要连接到数据库,CRUD 数据的时候写一大串的
- try{}catch{},几乎每次都写,真是他妈的烦死啦。大家肯定有同感吧,反正我开始还不会用ORM工具的时候就觉得很麻烦的
- 而当你看啦下面这个例子后就就会觉得方便多啦.也不用写那么多的try catch{}啦,
- 直得高兴的是Spring中对这做啦很好的封装,所以我就横批写啦一个,这样就不与Spring偶合在
- 一起啦,可以单独的拿出来使用.
- 这时是数据库的表:
- DROP DATABASE IF EXISTS `hibernate`;
- CREATE DATABASE `hibernate` ;
- USE `hibernate`;
- CREATE TABLE `person` (
- `id` int(32) NOT NULL DEFAULT '0',
- `name` varchar(20) NOT NULL,
- `password` varchar(20) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
- 1.首先我们先做一个接口,现在先不管它,等下你就知道他有什么用啦
- package com.dongguoh;
- import java.sql.*;
- /*
- * 用匿名类的方式去运用这个接口
- */
- public interface IStatementCallback {
- public Object doInStatement(Statement stmt) throws RuntimeException,SQLException;
- }
- 2.而这里是最关键的,就是建一个Jdbc的模板方法,把那些经常要做的try{} catch{}都写在一个类里
- 免得以后每次都还去写。这就成啦代码复用.
- package com.dongguoh;
- import java.sql.*;
- /*
- * 在这里我就不用Spring的注入啦,直接写个完整的
- * 如果不会Spring的,也同样的像使用Spring中的JdbcTemplate类一样的使用.
- * 如果你看过Spring的书,那么这个例子也是一个Spring的入门jdbc的好例子
- *
- * 而在这里我们的这个JdbcTemplate就成啦一个通用的方法,以后我们要SQL语句连接数据库的
- * 时候不用每次都去写try{}catch{}啦,老那样写真的很烦,一次性就把它搞定啦
- */
- public class JdbcTemplate {
- public Object execute(IStatementCallback action) {
- Connection conn = null;
- Statement stmt = null;
- Object result = null;
- try {
- conn=this.getConnection();
- conn.setAutoCommit(false);
- stmt=conn.createStatement();
- //注意这一句
- result=action.doInStatement(stmt);
- conn.commit();
- conn.setAutoCommit(true);
- } catch (SQLException e) {
- transactionRollback(conn);//进行事务回滚
- e.printStackTrace();
- throw new RuntimeException(e);
- }finally{
- this.closeStatement(stmt);
- this.closeConnection(conn);
- }
- return result;
- }
- /*
- * 当发生异常时进行事务回滚
- */
- private void transactionRollback(Connection conn){
- if(conn!=null){
- try {
- conn.rollback();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- //关闭打开的Statement
- private void closeStatement(Statement stmt){
- if(stmt!=null){
- try {
- stmt.close();
- stmt=null;
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- //关闭打开的Connection
- private void closeConnection(Connection conn){
- if(conn!=null){
- try {
- conn.close();
- conn=null;
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- //取得一个Connction
- private Connection getConnection() {
- String driver = "com.mysql.jdbc.Driver";
- String url = "jdbc:mysql://127.0.0.1/Hibernate";
- Connection conn=null;
- try {
- Class.forName(driver);
- conn = DriverManager.getConnection(url, "root", "dongguoh");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return conn;
- }
- }
- 下面是我们的测试方法:
- package com.dongguoh;
- import java.sql.*;
- import junit.framework.TestCase;
- public class TestTemplate extends TestCase {
- public void testJdbcTemplate(){
- JdbcTemplate jt=new JdbcTemplate();
- /*
- * 因为IStatementCallback是一个接口,所以我们在这里直接用一个匿名类来实现
- * 如果已经正确的插入啦一条数据的话 ,它会正确的返回一个 整数 1
- * 而我们这里的stmt是从JdbcTemplate中传过来的
- */
- int count=(Integer)jt.execute(new IStatementCallback(){
- public Object doInStatement(Statement stmt) throws RuntimeException, SQLException {
- String sql="INSERT INTO person VALUES(1,'dongguoh','123456')";
- int result=stmt.executeUpdate(sql);
- return new Integer(result);
- }
- });
- System.out.println("Count: "+count);
- /*
- * 在这里我们就把刚刚插入的数据取出一个数据,直接输出来
- *
- */
- jt.execute(new IStatementCallback(){
- public Object doInStatement(Statement stmt) throws RuntimeException, SQLException {
- String sql="SELECT name,password FROM person WHERE id=1";
- ResultSet rs=null;
- rs=stmt.executeQuery(sql);
- if(rs.next()){
- System.out.println(rs.getString("name"));
- System.out.println(rs.getString("password"));
- }
- /*
- * 在这里就直接返回一个1啦,如果你愿意的话,你可以再写一个Person类
- * 在if语句中实例化它,赋值再把它返回
- */
- return new Integer(1);
- }
- });
- }
- }
- 测试结果:
- Count: 1
- dongguoh
- 123456
- 如果你要用 PreparedStatement 的话,想传参数的话,再写一个接口来实现,再在JdbcTemplate重载一个方法
- 如public Object execute(IPreparedStatementCallback action,,Object[] objArray)再多传一个你要传递的参数数组,
- 这样做就OK啦,试试吧,感觉会更好,这就是模板方法给我们带来的好处,没事看看 设计模式 类的书感觉蛮爽的
相关推荐
【转】Spring中模板模式和回调模式的讲解
NULL 博文链接:https://zhang23242.iteye.com/blog/1904116
Spring框架中的模板方法模式
在软件开发中,设计模式是解决常见问题的经验总结,能够提供一种优雅的解决方案。Spring框架作为一个开发Java应用程序的强大工具,积极采用和借鉴了多种设计模式,其中依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC)是其核心概念和设计原则。除了DI和IoC,另一个常用的设计模式是模板方法模式(Template Method Pattern),它在Spring中的应用同样具有重要意义。
模仿spring jdbcTemplate的实现
模仿spring jdbcTemplate的粗略实现,只有很小的参考价值,如果是java初学者可以使用这个封装好的工具进行数据库操作,只需要在db.properties里配置好driver,url等信息
模仿spring的jdbcTemplate
看着spring的jdbc模板,以前写过一个,贴上,回忆下过去~ JdbcBaseDAO package org.xiziyin.shop.dal.dao.jdbcimpl;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.D...
保姆级教程:在STM32H750VBT6上跑起来CMSIS-DSP库(基于CubeMX+Keil)
本文详细介绍了在STM32H750VBT6微控制器上配置和运行CMSIS-DSP库的全过程,包括开发环境搭建、CubeMX工程配置、Keil工程设置以及DSP库的实际应用示例。通过FFT频谱分析和音频均衡器等实战案例,展示了如何利用STM32H750VBT6的硬件FPU加速DSP运算,提升实时信号处理性能。
MATLAB 设置legend加标题
x1 = linspace(0,5); y1 = sin(x1/2); plot(x1,y1) hold on x2 = [0 1 2 3 4 5]; y2 = [0.2 0.3 0.6 1 0.7 0.6]; scatter(x2,y2,'filled') hold off legend({'sin(x/2)','2016'},'Location','northwest','Orientation','horizontal')%水平 legend添加标题 lgd = legend; lgd.Fon
Spring中的模板模式
文章目录前言一、模板模式优缺点?二、代码例子 前言 所谓模板,即定义了一套标准版的骨架,我们需要做的就是在此基础上不断演化新的版本,已达到设计需要。如果要以开发者的编程思维角度去思考这个设计方式,也就是准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。 一、模板模式优缺点? 优点 提高代码复用性。将相同部分的代码放在抽象的超类中。 提高拓展性。将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为。 实现了反向控制。通过一个父类调用其子类的操
IMU自动校准论文与代码实现A Robust and Easy to Implement Method for IMU Calibration without External Equipments
PART1 摘要 低成本的惯性测量单元会受到系统误差的影响,系统误差由标度因子和轴偏差造成,这会降低位置和姿态估计的精度。 本文提出了一种无需任何外部设备的,鲁棒性强,易于实现的IMU校准方法。 该程序基于多放置方案,再估计传感器偏差的同时,为加速度和陀螺仪三轴的尺度和偏差系数。我们的方法只需要用手移动传感器,并将其放置在一组不同的静态位置(姿态)。 论文描述了一个鲁棒的快速校准协议,...
模板模式 模仿Spring写的 JdbcTemplate 不懂Spring 没关系
在这里我首先以一个比较简单的小例子让不知道模板模式的人先有个入门的概念。(如果要想深入了解,去看) 在后面的例子我将以一个比较实用的例子来说明这种模式给我们带来的好处,并且这个例子很实用。下面我会把所有的代码都贴出来,你可以直接Copy代码就可以运行,如果你已经有啦一定了解,那么就直接看第二个吧。在这里我希望你把它看完,并把它理解。因为开始我在看Spring的源码的时候也是看啦好多次才把思
【opencv3 学习记录】第二章 读取显示保存视频
一:捕获视频函数 1.函数:cv2.VideoCapture(参数) 2.参数说明: (1)开启摄像头:参数一般为0,你可以通过设置成 1 或 者其他的来选择别的摄像头。 (2)从文件夹中获取视频:参数为字符串形式的文件路径 3.示例: cap = cv2.VideoCapture(0) #cap:存放参数 二:读取视频函数 1.函数:cap.read() 2.函数说明: (1)cap.read 中cap与捕获视频函数存放函数一致,可以自己命名.括号一般不用填写 (2)ret,f
通义千问AI模型对接飞书机器人-集成飞书机器人(2-2)
http请求地址上一篇百炼平台配置的应用地址。
模板方法模式在JDBC与Spring JdbcTemplate流程统一中的应用深度解析
模板方法模式是一种行为型设计模式,定义了一个操作中的算法骨架,将部分步骤延迟到子类实现。父类负责整体流程,子类专注实现具体细节。口诀速记:“流程父类定,细节子类填;骨架统一,扩展自如。fill:#333;fill:none;ry:5px;ry:5px;ry:0;ry:5px;rx:0;ry:0;rx:0;ry:0;接收请求调用handleRequest返回ModelAndView模板方法模式通过“统一主流程,开放细节扩展”,极大提升了业务代码的复用性与可维护性。
DeepSeek与YOLO融合技术的微信小程序实现方案
本文介绍了一个基于微信小程序和Flask后端的智能图像检测系统。系统采用DeepSeek-7B进行自然语言理解,YOLOv8执行目标检测,并通过融合验证模块确保结果准确性。核心流程包括:用户通过小程序上传图片和文本需求,后端解析意图后执行目标检测,最后验证并返回结果。关键技术包括DeepSeek的指令理解、动态阈值调整和模型优化(ONNX、TensorRT)。系统适用于工业质检等场景,如"检测表面划痕",能自动识别目标并验证结果。部署需GPU服务器,并包含安全机制保障系统稳定运行。
jdbctemplate连接释放_设计模式及其在Spring中的应用——模板模式 在JdbcTemplate中...
模板模式在JdbcTemplate模板模式模板模式UML图在模板模式中:父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现。最大的好处:代码复用,减少重复代码。除了子类要实现的特定方法,其他方法及方法调用顺序都在父类中预先写好了。所以父类模板方法中有两类方法:共同的方法: 所有子类都会用到的代码不同的方法: 子类要覆盖的方法,分为两种:抽象方法:父类中的是抽象方法,子类必须覆盖钩子方法:...
Python爬虫实战:实时监控美国SEC官网文件更新,助你第一时间掌握市场动态
在资本市场中,信息就是财富。美国证券交易委员会(SEC)官网公开了大量公司披露文件,涵盖财报、招股说明书、内幕交易等重要信息。对投资者、分析师及法律合规人员来说,实时监控这些公开文件具有重要价值。
C++笔记之emplace_back(),push_back()性能比较i++ 、 ++i
操作是否需要临时对象/拷贝性能需要(构造临时对象)较慢不需要(直接构造)较快i++需要(保存旧值)对于内置类型无影响,但对于自定义类型(如迭代器、大对象)会有拷贝开销++i不需要相对更快(尤其是自定义类型)都存在"是否需要额外的临时对象/拷贝"这一性能差异点和++i都是更高效的版本(避免临时对象/拷贝)和i++都可能产生额外的临时对象(前者构造临时对象,后者保存旧值)对于内置类型(如int),i++和++i性能几乎没有差异(编译器会优化);但对于自定义类型(尤其是迭代器等重量级对象),
模板模式(spring JdbcTemplate 实际案例)
设计模式原则 开闭原则 对扩展开放,对修改关闭。 依赖倒置原则 通过抽象使各个类或者模块不相互影响,实现松耦合。 单一职责原则一个类、接口、方法只做一件事。 接口隔离原则 尽量保证接口的纯洁性,客户端不应该依赖不需要的接口。 迪米特法则又叫最少知道原则,一个类对其所依赖的类知道得越少越好。 里氏替换原则 子类可以扩展父类的功能但不能改变父类原有的功能。 合成复用原则尽量使用对象组合、聚合,而不使用继承关系达到代码复用的目的。 模板模式 我们平时办理入职流程填写入职登记表–>打印简历–>复印学
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
设计模式-模板模式
模板模式是一种行为型设计模式,它通过将算法的骨架抽象成一个模板方法,将具体的操作留给子类来实现。这种模式的主要思想是将一个行为定义为一个框架,然后由子类填充细节。在模板模式中,抽象类公开定义了执行它的方法的方式/模板。子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种模式旨在定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板模式封装不变部分,扩展可变部分,提取公共代码,便于维护。
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
Spring中的设计模式:模板方法模式
导读 文章首发于微信公众号设计模式:模板模式,原创不易,谢谢支持!!! 模板模式在是Spring底层被广泛的应用,比如事务管理器的实现,JDBC模板的实现。 今天就来谈谈「什么是模板模式」、「模板模式的优缺点」、「模板模式的简单演示」、「模板模式在Spring底层的实现」。 什么是模板模式 模板模式首先要有一个抽象类,这个抽象类公开定义了执行它的方法的方式/模板。它的子...
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
你写 JdbcTemplate 的 callback 写了三年——这就是模板方法,但你从没把它当设计模式
这个认知没错,但只覆盖了模板方法 20% 的用法——剩下的 80% 藏在各种 Spring 组件里,你天天在用却从来没把它跟设计模式挂钩。剩下的 6 个步骤是 JdbcTemplate 帮你写好的——这就是模板方法模式的本质:**固定流程 + 可变步骤**。# 你写 JdbcTemplate 的 callback 写了三年——这就是模板方法,但你从没把它当设计模式。ps -> ps.setString(1, "PAID"), // 步骤1:设置参数。8. 归还连接到连接池。
模板方法模式在JDBCTemplate中的应用
回调接口和模板方法类之间的关系可以看作服务与被服务的关系,模板方法类想要回调接口做事,就要提供相应的资源,接口用提供的资源做事,完事后,模板方法类来处理公开的资源,回调接口不需要在关心这些。此时当调用者调用update方法时,迫使实现PreparedStatementCreater 接口中的createPreparedStatement方法。此时多条数据映射一个部门对象,根据查询结果集逐条映射的逻辑是不对的,因此查询方法也要进行改造,同样是通过的传入接口迫使调用者实现剩余逻辑的方法来做。
Spring里的模板方法设计模式,JdbcTemplate、RedisTemplate、RestTemplate源码分析
前言:设计模式是阅读源码的一项极其重要的内功心法,而其中模板方法设计模式的套路在JDK、Spring、Mybatis、Maven中被广泛使用,如:Spring中的各种Template,有JdbcTemplate、RedisTemplate、RestTemplate皆是这种老把戏,假如您对该内功心法了如指掌,那么阅读它们的源码简直快地飞起,甚至能依葫芦画瓢,设计出HttpTemplate、FtpTemplate根本不在话下。 模板方法设计模式简介:在一个方法里定义了做事的流程,该流程中的某些步骤的实现逻辑是
从模板方法模式到JDBCTemplate
将大象装进冰箱需要三步,那么老虎了?如何优雅的将大象装进冰箱? 把大象装进冰箱 Step 大象 老虎 ... First 打开冰箱门 打开冰箱门 打开冰箱门 Second 把大象放进去 把老虎放进去 ... Third 关闭冰箱门 关闭冰箱门 关闭冰箱门 大象类 public class Elephant { public void putR...
带你在项目中玩转设计模式之模板模式(JdbcTemplate为例,Service层实际案例)
一、模板方法模式是什么?有哪些应用场景? 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。它适应的场景有:一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。(百度百科)。 看到定义或许会很迷糊,我们可以通过例子说明,其实模板模式的一个典型的应用就是Spring的JdbcTemplate,这是一个经典的模板模式,我们就以Spring的
模板模式之spring的jdbcTemplate
转载:http://www.iteye.com/topic/713770?1306420721 最近一直在研读spring源码和学习设计模式,想把自己的一些领悟与大家分享,前几天发了几篇简单的文章,可能由于文字过于简单,几次被评为新手贴,心中滴汗啊 没办法,工作太忙,大家都知道,写篇文章是要很大精力地~~~~~ 今天恰有时间,把这两天的学习所得与大家分享,尽量写得详细一些,专家饶路走,新手觉得好...
使用Spring的JdbcTemplate实现DAO
直接使用JDBC操作数据库来实现DAO,相对于使用持久层框架(Hibernate等) ,可以减少映射等带来的性能损失。一般而言,使用JDBC来操作数据库,无非是以下几个步骤: 获取数据源 取得数据库连接 执行SQL语句 处理执行结果和异常 释放数据库连接这些步骤是每次进行数据库操作都必须进行的。很显然,可以使用模板模式来简化设计,将执行SQL语句的部分抽象出来,其它的
1783



被折叠的 条评论
为什么被折叠?



