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就具有很好的灵活性