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中体现得...
模板方法模式是一种行为设计模式,它允许在定义行为框架的同时,延迟部分具体步骤到子类中实现。这种模式主要用于在父类中定义算法的骨架,而将一些步骤的实现细节留给子类去完成,从而使得不同的子类可以重用相同的...
标题中的"spring模板方法.zip"表明这是一个关于Spring框架的压缩包,特别提到了Spring Boot项目。模板方法设计模式是面向对象设计模式的一种,它在Spring框架中被广泛应用于简化代码和实现可扩展性。在Spring Boot中...
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
Spring 设计模式之装饰器模式详解 在软件设计中,经常会遇到需要在不修改原有代码的情况下,添加新的功能或行为。这时,装饰器模式便可以发挥其作用。在 Spring 设计模式中,装饰器模式是非常重要的一种设计模式。 ...
模板模式是一种设计模式,它定义了算法的骨架,允许子类在不改变算法结构的情况下重写特定步骤。在Spring中,JdbcTemplate就是一个典型的模板类,它实现了数据库操作的基本流程,如创建Connection、...
模板方法设计模式是一种行为设计模式,它在面向对象编程中扮演着重要的角色。这个模式的主要目的是定义一个操作的框架,允许子类在不改变整体结构的情况下重定义具体步骤。这有助于保持代码的整洁,实现代码复用,并...
模板方法模式是面向对象设计模式中的行为模式之一,它在Java编程中有着广泛的应用。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定...
在软件设计模式的世界里,工厂模式和模板方法模式是两种常用的设计模式,它们都有各自的优点和应用场景。这两种模式都是面向对象设计原则的体现,能够帮助我们编写出更加灵活、可扩展的代码。让我们来深入探讨一下这...
模板方法模式(Template Method Pattern)是一种行为设计模式,它允许在父类中定义算法的框架,然后由子类提供具体的实现。这种模式的核心是“模板方法”,它在父类中定义了一个操作的步骤顺序,并将某些步骤声明为...
在Spring框架中,模板模式和回调模式是两种重要的设计模式,它们被广泛应用于处理各种不同的任务,如数据访问、远程调用等。这两种模式都旨在提高代码的可扩展性和复用性,使得开发者能够以更加灵活的方式处理业务...
【Spring AOP设计模式】是Spring框架中面向切面编程的重要组成部分,它允许开发者通过分离关注点来解耦代码,实现灵活的模块化设计。在本章中,我们将探讨17种设计模式在Spring AOP中的应用和实现,以及它们如何帮助...
模板模式是一种行为设计模式,它在Java编程中扮演着重要的角色,主要用来定义算法的骨架,而将一些步骤延迟到子类中。这种模式让子类可以在不改变算法整体结构的情况下,重定义某些特定步骤。在Java设计模式之模板...
Spring 框架的设计理念与设计模式分析 Spring 框架作为Java开发中最受欢迎的框架之一,其设计理念和设计模式的应用对于理解和优化软件设计具有重要意义。本文将深入探讨Spring的核心组件、设计理念以及其中蕴含的...
4. **模板方法模式**:Spring框架中的某些组件采用了模板方法模式,比如JdbcTemplate等,为开发者提供了一种通用的操作数据库的方式。 5. **观察者模式**:Spring事件传播机制使用了观察者模式,使得组件之间能够...
模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。 ### 模板方法模式的关键角色 1. **...
### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其设计理念与设计模式一直是开发者关注的焦点。Spring框架旨在简化企业级应用程序的开发过程...
Spring设计模式总结 在软件开发中,设计模式是解决常见问题的经验总结,它们为程序员提供了在特定场景下设计高效、可维护代码的蓝图。在Spring框架中,许多设计模式被广泛应用,以提升系统的灵活性和可扩展性。以下...