`

也谈谈Spring中的Template和Callback模式

阅读更多
前几天在论坛看到谈论Spring中的Callback模式和Template模式,我以前也提到过Spring中JdbcTemplate中使用的Callback , 自己回来想了想,总结一下自己的想法。
Spring中的Callback模式与Template模式合用,随处可见。Template method被广泛的使用,像Servlet就是使用这个模式。Template mothod模式虽然能简化很多重复的代码,但这种模式的也有不少限制。Template mothod将一个功能的实现分成许多小的步骤,在父类中定义了这些步骤的顺序,让子类来具体实现每一个小的步骤。这些小的步骤是protected,以防止用户不正确的使用这些小的步骤而产生异常。这样就产生了一个限制,那就是你需要继承Template然后重新实现具体的小步骤。如果这个Template有许多方法,就像JdbcTemplate,如果你每次继承这个庞大的类,然后只是重写某个小步骤中来订制你自己的功能,就会显得非常笨重,更何况数据库操作使用的如此频繁,难道你每进行一个操作就通过继承订制一个,显然不可能这么做。
Spring使用Callback模式与之配合,达到了去掉重复代码的效果,同时增加了很大的灵活性,你只需要实现某些CallBack就可轻松订制出Template。
那么什么时候才是Callback模式与Template模式结合的最佳时机呢。显然如果每个具体的步骤都需要真正去具体实现而不是简单的改变参数或设置某个对象就ok的话,使用Callback很难去订制,因为你可能需要传递多个Callback作为参数,并让用户去实现,是用Java的内部类本来就是一个比较丑陋的语法,更何况参数是多个。这相当于你把每个小步骤封装成为接口,然后分别继承之然后实现。显然没有达到方便灵活的效果,这时候直接使用Template method模式就比结合Callback要好。而如果用户只需要定制一个方法能就达到用户的要求,或者更简单,只是设置不同的参数,那么使用Callback就具有很好的灵活性。
分享到:
评论
12 楼 Godlikeme 2007-04-19  
http://www.martinfowler.com/bliki/InversionOfControl.html
恩,这是我查到的martin的关于template method的ioc介绍。
11 楼 hpq852 2007-04-19  
fuliang 写道
hpq852 写道
template method 和 callback 都属于IoC, 只不过具体的实现方式不一样, template method要通过继承实现, 而callback 通过组合或者依赖实现, 根据具体情况选择具体的实现. 本质没有任何区别.

template method和callback怎么会都属于IOC,
他们和IOC有什么关系么?
IOC的核心是一个能根据配置来组装对象的工厂,与上述两个模式沾不上边吧?


组装对象的工厂只是IoC的一个应用, 不要忘了IoC就是Inversion of Control. 至于template method和IoC的关系, google一下吧, 很多的
10 楼 fuliang 2007-04-19  
hpq852 写道
template method 和 callback 都属于IoC, 只不过具体的实现方式不一样, template method要通过继承实现, 而callback 通过组合或者依赖实现, 根据具体情况选择具体的实现. 本质没有任何区别.

template method和callback怎么会都属于IOC,
他们和IOC有什么关系么?
IOC的核心是一个能根据配置来组装对象的工厂,与上述两个模式沾不上边吧?
9 楼 Godlikeme 2007-04-19  
hpq852 写道
template method 和 callback 都属于IoC, 只不过具体的实现方式不一样, template method要通过继承实现, 而callback 通过组合或者依赖实现, 根据具体情况选择具体的实现. 本质没有任何区别.

这个区别已经很大了,
采用组合还是继承属于设计上比较本质的区别,没有看出templateMethod何处体现Ioc
8 楼 hpq852 2007-04-18  
Spring中的 JdbcTemplate 或者 HibernateTemplate只能算是 callback模式的应用, 不是 template method模式
7 楼 hpq852 2007-04-18  
template method 和 callback 都属于IoC, 只不过具体的实现方式不一样, template method要通过继承实现, 而callback 通过组合或者依赖实现, 根据具体情况选择具体的实现. 本质没有任何区别.
6 楼 Godlikeme 2007-04-18  
殊途同归,
5 楼 Godlikeme 2007-04-18  
哦,报bug,^_^
4 楼 fuliang 2007-04-18  
不好意思,我写的时候只有二楼,引用上一条,想引用二楼的,结果引用你的了.
3 楼 Godlikeme 2007-04-18  
fuliang 写道
Godlikeme 写道
lz分析的很好,

不太同意callback与template是一个思路,最大的不同在于类继承。由于java是单基类继承,callback在这方面提供了更大的灵活性,减少了Template模式强制类继承给设计上带来的麻烦。
使用CallBack是为了避免用户继承Template,而是直接让用户实现去CallBack接口就可以达到订制的目的,不是让 "子类继承Template类".


我说的和你说的哪里不一样呢?简单在原文修改下,也许这样更准确些吧。

我不太同意2楼的观点。
2 楼 fuliang 2007-04-18  
Godlikeme 写道
lz分析的很好,

不太同意callback与template是一个思路,最大的不同在于类继承。由于java是单基类继承,callback在这方面提供了更大的灵活性,减少了类继承给设计上带来的麻烦。
使用CallBack是为了避免用户继承Template,而是直接让用户实现去CallBack接口就可以达到订制的目的,不是让 "子类继承Template类".
1 楼 Godlikeme 2007-04-18  
lz分析的很好,

不太同意callback与template是一个思路,最大的不同在于类继承。由于java是单基类继承,callback在这方面提供了更大的灵活性,减少了Template模式强制类继承给设计上带来的麻烦。

相关推荐

    【Java 设计模式-源码】Callback 模式:掌握异步通信

    在 Java 开发中,Callback 模式是一种重要的设计模式,用于处理异步通信和事件处理。本文将详细介绍 Callback 模式的意图、解释、编程示例、适用场景、实际应用、优点和权衡。同时,还将提供示例代码的下载链接,...

    Spring Dao层设计

    Spring 数据库访问的支持。包括统一异常体系和Spring的Template+CallBack的解读

    59丨模板模式(下):模板模式与Callback回调函数有何区别和联系?1

    例如,Spring框架中的`JdbcTemplate`虽然名字中含有“Template”,但它其实主要依赖于回调机制。`JdbcTemplate`执行SQL查询时,会调用用户提供的回调方法来处理结果集,这类似于同步回调,因为结果处理在查询完成后...

    spring、ioc、aop、callback

    在 Spring 中,回调机制常用于处理事件或者在生命周期中执行特定任务,如 Bean 的初始化和销毁。开发者可以通过实现特定接口或使用注解来定义回调方法。 结合这些概念,我们可以创建一个灵活、可扩展的系统。例如,...

    android中的Handler和Callback机制.pdf

    Android 中的 Handler 和 Callback 机制 Android 中的 Handler 和 Callback 机制是 Android 应用程序中的一种重要机制,用于线程之间的通信和消息传递。Handler 是 Android 中的一种机制,用于在线程之间传递消息,...

    C++中回调函数(CallBack)的用法分析

    本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...

    基于鸿洋okhttputils 封装数据 bean和callback 回调

    总结起来,基于鸿洋的OkHttpUtils封装数据Bean和Callback回调,可以帮助我们更高效地处理网络请求,减少手动解析数据的工作,同时利用泛型提供类型安全。在实际项目中,可以结合`OkCallbackUtil`进一步优化网络请求...

    JdbcTemplate教程

    除了大量使用Template Method来封装一些底层的操作细节,spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能,使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。

    用友U9客户化开发 Callback & Postback 入门 v0.8

    用友U9客户化开发 Callback & Postback 入门 v0.8 是一份关于用友U9客户化开发中 Callback 和 Postback 的基础知识入门文档。该文档详细介绍了 Callback 和 Postback 的概念、实现方法以及注意事项。 Callback 是一...

    设计模式Callback介绍与实例

    >回 调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口; >异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方...

    VC++ CALLBACK

    通过深入理解回调函数的工作原理和使用方式,开发者可以在VC++项目中更加灵活地控制流程,实现更复杂的交互和异步处理。回调函数是C++和许多其他编程语言中一个强大的工具,值得开发者熟练掌握。

    Spring源码缺失的spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar

    在Spring框架中,`spring-cglib-repack-3.2.6.jar`和`spring-objenesis-repack-2.6.jar`是两个重要的依赖库,它们在Spring源码环境中扮演着不可或缺的角色。本文将详细介绍这两个库以及它们在Spring框架中的作用。 ...

    Callback

    本文将深入探讨标题中的"Callback"主题,结合C#语言和Windows Service服务程序,以及进程间通信(Inter-Process Communication, IPC)的相关知识。 首先,让我们了解什么是回调函数。回调函数是一种设计模式,它...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

    回调技术(CallBack)源码

    回调技术(Callback)是软件设计模式中的一种,它在异步编程或事件驱动编程中扮演着重要角色。回调函数是一种代码执行模式,允许一个函数或方法在特定事件发生时被另一个函数调用。这种机制使得程序能够以非阻塞的...

    C++中回调(CallBack)的使用思路

    回调(Callback)是一种重要的编程模式,在C++中广泛应用于多种场景,尤其是处理事件驱动或异步操作时。简单来说,回调是一种将函数作为参数传递给另一个函数的方式,这样被调用的函数可以在适当的时候执行传入的...

    CallBack_DEMO 回调

    回调(Callback)是一种在软件设计模式中常见的编程概念,它允许一个函数或对象在完成某个操作后通知另一个函数或对象。在本示例"CallBack_DEMO"中,我们可能正在探讨如何在Java或其他编程语言中实现回调机制。回调...

    详解如何在低版本的Spring中快速实现类似自动配置的功能

    在低版本的Spring中实现类似自动配置的功能,主要目的是为了在不升级或重构现有系统的情况下,增强系统的功能和灵活性。...通过这种方式,即使在没有高级特性支持的老版本Spring中,也能实现灵活的配置管理和功能扩展。

    C# WCF CallBack Demo

    在WCF中,回调(Callback)是一种高级通信模式,它允许服务主动向客户端发送数据,而不仅仅是响应客户端的请求。这种模式在需要实时数据更新或双向通信的应用场景中非常有用。下面我们将深入探讨C# WCF回调的基本...

    详解protobuf-c之在C语言中如何使用repeated生成数组和字符串(包含配置pb-callback-t)

    本篇文章将详细解释如何在C语言环境中使用protobuf-c处理`repeated`字段,创建数组和字符串,并特别关注`pb_callback_t`这一特殊类型。 首先,我们需要理解`repeated`字段在protobuf语义中的含义。在protobuf的定义...

Global site tag (gtag.js) - Google Analytics