概述
模板方法模式是GOF设计模式中很典型的设计模式,其意图是由抽象父类控制*逻辑,并把基本操作的实现推迟到子类去实现,这是通过继承的手段来达到对象的复用。Spring模板方法模式实际是模板方法模式和回调模式的结合,Spring几乎所有的外接扩展都采用这种模式,如JNDI,JMS,JCA的 CCI,JDBC,ORM中的Hiberate3、jdo、Toplink等扩展都采用模板方法模式来扩展。
经典的模板方法设计模式
开闭原则是指一个软件实体应该对扩展开放,对修改关闭。先制定一个*逻辑框架,而将逻辑的细节留给具体的子类去实现。如图所示,面向接口编程,client只需调用Template接口中的execute方法,在AbstractTemplate抽象类的示例代码所示,实现execute()方法,但在execute()方法中制定所需的大的步骤,调用如subExecute1(),subExecute2(),subExecute3()方法来完成,但AbstractTemplate抽象类把subExecute1(),subExecute2()设置为抽象方法,由子类来实现,subExecute3()给出了缺省实现,也可由子类来覆盖,如SubTemplateImpl2类。
public abstract class AbstractTemplate implements TemplateInterface { public void execute() { subExecute1(); subExecute2(); subExecute3(); } protected abstract void subExecute1(); protected abstract void subExecute2(); protected void subExecute3() { } } |
-- HibernateTemplate提供的便利
-- 一般我们使用Session的时候,如果这个Session是通过SessoionFactory的openSession方法而来,那么我们需要通过Try-Catch-Finally代码块来讲Session以及Transaction操作包裹。这么做的目的主要有两方面:
1. 出现异常时及时回滚Transaction。
2. 无论出现异常与否都可以在Finally代码块里关闭Session。这种情况就如同使用JDBC通过Connection连接数据库的操作。
-- 但是在Hibernate中,Session有关数据库操作的方法很多,如果在每次使用这些Session方法时都写一遍Try-Catch-Finally代码块,我们的代码就会变得很不优雅。不符合面向对象复用的原则。
-- 使用HibernateTemplate(实际上Spring对包括JDBC在内的大部分持久化技术都做了Template的支持),也就是模板方法设计模式,就可以免去重复这些代码块的工作。而只需要集中于Session的方法调用就可以了。
-- HibernateTemplate的使用
-- 将HibernateTemplate交给Spring管理
-- 将HibernateTemplate实例注入程序
-- 调用HibernateTemplate执行Session方法
-- HibernateTemplate实现模板方法设计模式的原理
-- 从HibernateTemplate的save开始
-- 按照执行步骤查看executeWithNativeSession方法
-- doExecute方法
-- 下图中用黄色底色条标出的就是我们的匿名内部类对象。
-- doExecute方法回调了该对象的doInHibernate方法
-- 这里解释一下回调函数
-- 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
-- 但是在Java中并没有指针这种东西,所以使用了通过匿名内部类传递回调函数的办法。
-- 为什么要使用回调函数
因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
-- Java中使用回调函数的例子
在Java的listener模型中,一个事件发生,那么系统就会调用通过匿名内部类实现的handler,来做出响应。
-- 关于为什么匿名内部类使用方法的局部变量时,该变量需要声明为final的解释
-- 其实解释总结起来就是局部变量的生命周期太短,没有匿名内部类对象的生存周期长。所以必须将局部变量声明为final。从而该变量就不会被放在JVM存储区域的栈中,而会被放在方法区中,从而延长了生命周期,
-- The difference is between local (method) variables vs class member variables. A member variable exists during the lifetime of the enclosing object, so it can be referenced by the inner class instance. A local variable, however, exists only during the method invocation, and is handled differently by the compiler, in that an implicit copy of it is generated as the member of the inner class. Without declaring the local variable final, one could change it, leading to subtle errors due to the inner class still referring to the original value of that variable.
从Spring HibernateTemplate模板方法设计模式的实现谈起的更多相关文章
-
Spring 事务模板方法设计模式
接上一篇文章 上一篇讲到了doGetTransaction方法 一.模板方法设计模式 这里涉及到了一个经典的设计模式:模板方法 如下图: AbstractPlatformTransactionMana ...
-
Spring中的设计模式
[Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用] [http://www.geek521.c ...
-
JDK和Spring中的设计模式
创建型 1)工厂方法 Collection.iterator() 由具体的聚集类来确定使用哪一个Iterator 2)单例模式 Runtime.getRuntime() 3)建造者模式 StringB ...
-
大话设计模式-->;模板方法设计模式
在学习java的过程中,我们肯定听到过设计模式这名词,在行业中有这么一句话,若您能熟练的掌握23种设计模式,那么你便是大牛! 好了,废话不多说,今天我跟大家分享一下23种设计模式之一的 模板方法 设 ...
-
Java抽象类深入理解-----模板方法设计模式(Templete Method)
模板方法设计模式(Templete Method) 定义一个操作中的算法骨架,而将一些可变部分的实现延迟到子类中. 模板方法设计模式使得子类可以不改变一个算法的结构即可重新定义该算法某些特定的步骤. ...
-
Spring HibernateTemplate的使用
Spring HibernateTemplate的使用 2008-03-25 11:38 2020人阅读 评论(0) 收藏 举报 springbeanhibernatesessiondaoclass ...
-
【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查
原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...
-
Java设计模式——模板方法设计模式(abstract修饰)
解释: 一个抽象类中,有一个主方法,再定义 1...n 个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用. 解决的问题: 当功能内部一 ...
-
Spring源码分析 之浅谈设计模式
一直想专门写个Spring源码的博客,工作了,可以全身性的投入到互联网行业中.虽然加班很严重,但是依然很开心.趁着凌晨有时间,总结总结. 首先spring,相信大家都很熟悉了. 1.轻量级 零配置, ...
随机推荐
-
win10使用技巧
无法使用内置的管理员账户打开应用的问题命令行里输入:secpol.msc安全设置-本地策略-安全选项点击找到“用户账户控制:用于内置管理员账户的管理员批准”选项.该选项设置为"已启用&quo ...
-
[sicp]huffman编码的实现 @ Scheme
#lang racket (define (length items) (if (null? items) (+ (length (cdr items))))) (define (element-of ...
-
linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q = from p in ...
-
Screen tearing
Umm, screen tearing happens when the frame rate and the monitor refresh rate don't match. When that ...
-
python 操作PostgreSQL
pip install psycopg Python psycopg2 模块APIs 以下是psycopg2的重要的的模块例程可以满足Python程序与PostgreSQL数据库的工作. S.N. A ...
-
html table 保存到excel中
引用:HTML中的table导出为Excel文件 <!DOCTYPE html> <html lang="en"> <head> <met ...
-
java webdriver的api的封装
我们来看一下官网提供的代码写法,即最原始的写法: driver.findElement(By.id("kw")).click() 这样写是没任何问题的,但这样没有把元素对象,数据, ...
-
Dalvik VM (DVM) 与Java VM (JVM) 的区别?
Dalvik虚拟机存在于Android系统,JVM是java虚拟机,两者都是虚拟机,本文就对两者进行比较,讲述它们的不同. Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的 ...
-
TensorFlow笔记-07-神经网络优化-学习率,滑动平均
TensorFlow笔记-07-神经网络优化-学习率,滑动平均 学习率 学习率 learning_rate: 表示了每次参数更新的幅度大小.学习率过大,会导致待优化的参数在最小值附近波动,不收敛:学习 ...
-
首次使用JBoss流程(windows下)
1.首先应该明白JBoss分为社区版(AS)和企业版(EAP),其中社区版已经改名wildfly(难道是野苍蝇的意思?),企业版对个人开发者免费下载使用, 这里由于公司要求,我用的是jboss-eap ...