`

也谈谈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模式强制类继承给设计上带来的麻烦。

相关推荐

Global site tag (gtag.js) - Google Analytics