Spring 模板方法 vs 经典模板方法设计模式
李俊杰
概述
模板方法模式是GOF设计模式中很典型的设计模式,其意图是由抽象父类控制顶级逻辑,并把基本操作的实现推迟到子类去实现,这是通过继承的手段来达到对象的复用。Spring模板方法模式实际是模板方法模式和回调模式的结合,Spring几乎所有的外接扩展都采用这种模式,如JNDI,JMS,JCA的 CCI,JDBC,ORM中的Hiberate3、jdo、Toplink等扩展都采用模板方法模式来扩展。
<!----><o:p> </o:p>
经典的模板方法设计模式
开闭原则是指一个软件实体应该对扩展开放,对修改关闭。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。如图所示,面向接口编程,client只需调用Template接口中的execute方法,在AbstractTemplate抽象类的示例代码所示,实现execute()方法,但在execute()方法中制定所需的大的步骤,调用如subExecute1(),subExecute2(),subExecute3()方法来完成,但AbstractTemplate抽象类把subExecute1(),subExecute2()设置为抽象方法,由子类来实现,subExecute3()给出了缺省实现,也可由子类来覆盖,如SubTemplateImpl2类。
<!----><v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style="WIDTH: 369pt; HEIGHT: 270.75pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image001.emz" o:title=""></v:imagedata></v:shape>
public abstract class AbstractTemplate implements TemplateInterface
{
public void execute()
{
subExecute1();
subExecute2();
subExecute3();
}
protected abstract void subExecute1();
protected abstract void subExecute2();
protected void subExecute3()
{
<o:p> </o:p>
}
<o:p> </o:p>
} |
<o:p></o:p>
在Spring中也有对经典模板方法模式的运用,以Hibernate3为例说明
AbstractSessionFactoryBean模板方法afterPropertiesSet(),调用抽象方法buildSessionFactory()和缺省实现方法afterSessionFactoryCreation()<o:p></o:p>
public void afterPropertiesSet() throws Exception {<o:p></o:p>
SessionFactory rawSf = buildSessionFactory();<o:p></o:p>
this.sessionFactory = wrapSessionFactoryIfNecessary(rawSf);<o:p></o:p>
afterSessionFactoryCreation();<o:p></o:p>
}<o:p></o:p>
protected abstract SessionFactory buildSessionFactory() throws Exception;<o:p></o:p>
protected void afterSessionFactoryCreation() throws Exception {<o:p></o:p>
} |
在其子类中LocalSessionFactoryBean中则有相关子步骤方法的实现<o:p></o:p>
protected SessionFactory buildSessionFactory() throws Exception {<o:p></o:p>
… … //代码太长了<o:p></o:p>
return newSessionFactory(config);<o:p></o:p>
}
protected void afterSessionFactoryCreation() throws Exception {<o:p></o:p>
if (this.schemaUpdate) {<o:p></o:p>
DataSource dataSource = getDataSource();<o:p></o:p>
if (dataSource != null) { <o:p></o:p>
configTimeDataSourceHolder.set(dataSource);<o:p></o:p>
}<o:p></o:p>
try {<o:p></o:p>
updateDatabaseSchema();<o:p></o:p>
}<o:p></o:p>
finally {<o:p></o:p>
if (dataSource != null) {<o:p></o:p>
// Reset DataSource holder.<o:p></o:p>
configTimeDataSourceHolder.set(null);<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
} |
Spring模板方法模式的运用
Spring几乎所有的外接扩展,都采用模板方法模式,为了说明的更清楚些,用Hiberate3的扩展举例说明。
回调函数接口HibernateCallback
HibernateCallback接口,在该接口中只声明了一个方法doInHibernate(Session session),这个方法其实是由子类来实现的子步骤方法
public interface HibernateCallback {<o:p></o:p>
Object doInHibernate(Session session) throws HibernateException, SQLException;<o:p></o:p>
} |
模板方法类HibernateTemplate的模板方法execute()
HibernateTemplate类的execute()方法,值得注意的是execute()方法的一个参数是HibernateCallback接口,这就是Spring模板方法模式的核心和前提,为了清楚模板方法模式,把相关的事务处理及异常处理等代码去掉,这样可以清楚地看出HibernateCallback接口的 action.doInHibernate(sessionToExpose)仅仅是其中的一个步骤,并且action就是execute模板方法方法的第一个参数HibernateCallback接口的实际实现类。
public Object execute(HibernateCallback action, boolean exposeNativeSession) throws DataAccessException { <o:p></o:p>
previousFlushMode = applyFlushMode(session,existingTransaction);<o:p></o:p>
enableFilters(session);<o:p></o:p>
Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));<o:p></o:p>
Object result = action.doInHibernate(sessionToExpose);<o:p></o:p>
flushIfNecessary(session, existingTransaction);<o:p></o:p>
return result;<o:p></o:p>
<o:p></o:p>
} |
模板方法类HibernateTemplate的其他对外方法的匿名类方法实现回调
在HibernateTemplate类中实现HibernateCallback接口的却是匿名类,如get方法<o:p></o:p>
public Object get(final String entityName, final Serializable id, final LockMode lockMode)<o:p></o:p>
throws DataAccessException {<o:p></o:p>
<o:p> </o:p>
return execute(new HibernateCallback() {<o:p></o:p>
public Object doInHibernate(Session session) throws HibernateException {<o:p></o:p>
if (lockMode != null) {<o:p></o:p>
return session.get(entityName, id, lockMode);<o:p></o:p>
}<o:p></o:p>
else {<o:p></o:p>
return session.get(entityName, id);<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
}, true);<o:p></o:p>
} |
如load方法
public Object load(final Class entityClass, final Serializable id, final LockMode lockMode)<o:p></o:p>
|
分享到:
相关推荐
设计模式-模板方法模式(讲解及其实现代码)
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
本资源是spring的小例子程序,共包括以下7个: 数据访问对象模式(DAO) 工厂模式(factory) 模型视图控制器模式(MVC) 代理模式(proxy) ...模板模式(template) 另外还有一个关于动态代理的小例子
spring boot项目 里面涉及到了设计模式 非常的有用 适合
作为一个资深Java工程师,我发现《Spring 设计模式总结》PDF非常精彩,它深入剖析了Spring框架中的关键设计模式。例如,简单工厂模式通过BeanFactory展现,实现了松耦合和动态对象创建。工厂方法模式则通过...
共讲解了5种设计模式:工厂模式,抽象工厂,单例设计模式Singleton,业务代理(Business Delegate)类模式(或者:Proxy模式),模板(Template)方法模式. 从设计思路,特点,作用,常用方法等多方面讲解,有示例代码
NULL 博文链接:https://shaw-n-lu.iteye.com/blog/1747124
11.11 使用自定义布局和模板 472 11.11.1 问题 472 11.11.2 解决方案 472 11.11.3 工作原理 472 11.12 使用GORM查询 475 11.12.1 问题 475 11.12.2 解决方案 475 11.12.3 工作原理 475 11.13 创建...
11.11 使用自定义布局和模板 472 11.11.1 问题 472 11.11.2 解决方案 472 11.11.3 工作原理 472 11.12 使用GORM查询 475 11.12.1 问题 475 11.12.2 解决方案 475 11.12.3 工作原理 475 11.13 创建...
可用于新手学习,二次开发模板,课程设计,毕业设计等。项目经过严格测试,确保可以运行! 项目介绍 本项目采用前后端分离,接口开发模式进行开发。前台使用WeAdmin来进行对接。 基于SpringBoot的新闻管理发布系统...
基于Spring 3.0.2框架的10个Demo项目源码,都可以调试通过。 主要有: ...2)MVC设计模式案例; 3)宠物诊所petclinic案例; 4)Spring-Groovy案例; 5)Task案例; 6)模板案例; 7)Travel案例……等。
主要介绍了详解SpringBoot结合策略模式实战套路,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Spring Cloud简介 Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud ...
前后端分离项目,Spring boot作为后端,vue框架实现前端,后端...设置有跨域访问,MVVM设计模式,前后端联通使用axios(ajax框架),前端使用element plus组件库,统一采用路由方式跳转,设置有拦截器判断登录状态。
采用前后端分离的模式,微服务版本前端vue 后端采用Spring Boot、Spring Cloud & Alibaba。注册中心、配置中心选型Nacos,权限认证使用Redis。流量控制框架选型Sentinel,分布式事务选型Seata。 商品管理:商品类型...
它使用像MySQL和Oracle 10g这样的数据库以及设计模式Model-View-Controller(MVC)在Spring-Hibernate-Maven中进行编码。 Spring-Web 4.3.8 Spring安全4.2.2 JDK:1.8 Servlet Api:3.1.0 Hibernate:5.2.10决赛...
1.项目使用Axure进行原型设计,Power Design进行数据库模型设计,Rationnal Rose完成UML用例图、类图设计。 2.项目使用IDEA+Maven开发环境。 3.项目通过Git工具管理代码。 4.项目基于Springboot轻量框架完成后端开发...
联机模块的业 务处理采用控制层,业务逻辑处理层以及数据访问层三层架构,基于设计模式思想对 业务功能实现进行设计,数据库采用Oracle数据库,缓存使用Redis实现。对账模块 采用轻量级的批处理框架SpringBatch框架...
行为类型模式,共十种:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,注释模式,状态模式,访问者模式,中介者模式,解释器模式。 设计模式的六大原则 开闭原则(Open Close Principle)...
设计模式:熟悉一些常见的设计模式,例如单例模式、工厂模式、观察者模式等。理解每种设计模式的用途、实现方式以及适用的场景。 数据库:掌握SQL语言和数据库基本概念,了解关系型数据库(如MySQL、Oracle)和非...