首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Java回调与模板方法方式

2012-10-31 
Java回调与模板方法模式?一.Java回调与模板方法模式?模板方法模式很常用,其目的是在一个方法中定义一个算

Java回调与模板方法模式

?

一.Java回调与模板方法模式?

模板方法模式很常用,其目的是在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。在标准的模板方法模式实现中,主要是使用继承的方式,来让父类在运行期间可以调用到子类的方法。 其实在Java开发中,还有另外一个方法可以实现同样的功能,那就是Java回调技术,通过回调在接口中定义的方法,调用到具体的实现类中的 方法,其本质是利用Java的动态绑定技术,在这种实现中,可以不把实现类写成单独的类,而使用内部类或匿名内部类来实现回调方法。?

?

二.回调方法应用举例

1.应用场景:

在实际业务中处理中,有这样一种场景,我们会在业务的开始设置线程上下文变量,在业务结束时对线程上下文变量进行清空,很类似于JDBC的操作后对数据库资源的释放,我们可以借助回调方法实现其执行步骤。

2.代码实现

(1)定义业务模板,process()方法就是算法步骤。

?

public class BusinessTemplate<T> {private ProcessCallback<T> processCallback;public BusinessTemplate(ProcessCallback<T> callback) {this.processCallback = callback;}/** * 模板方法 */public T process() {try {System.out.println(ContextHolder.getContext());return processCallback.process();} finally {ContextHolder.clear();}}}

?

(2)回调处理类

?

public interface ProcessCallback<T> {/** * 回调处理。 * @return */T process();}
??

(3)ContextHolder类 ?

?

public class ContextHolder {private static final ThreadLocal<Context> threadLocal = new ThreadLocal<Context>();public static void setContext(Context context) {threadLocal.set(context);}public static Context getContext() {return threadLocal.get();}public static void clear() {threadLocal.remove();}}
??

(4)测试类

?

public class TestCallBack {public static void main(String[] args) {Context context = new Context();context.setBusinessName("name");context.setBusinessType("type");ContextHolder.setContext(context);BusinessTemplate<BusinessResult> template = new BusinessTemplate<BusinessResult>(new ProcessCallback<BusinessResult>() {public BusinessResult process() {BusinessResult businessResult = new BusinessResult();return businessResult;}});template.process();System.out.print(ContextHolder.getContext());}}

?

三.两种实现方式的比较?

1.模板方法模式借助于继承,对抽象方法在子类中进行扩展或实现,是在编译期间静态决定的,是类级关系。使用Java回调方法,利用动态绑定技术在运行期间动态决定的,是对象级的关系。

2.使用回调机制会更灵活,因为Java是单继承的,如果使用继承的方式,对于子类而言,今后就不能继承其它对象了。而使用回调,是基于接口的,方便扩展。 另外,如果有多个子类都要使用模板方法,则所有的子类都要实现模板方法,无形中增多了子类的个数。

3.使用模板方法模式使用继承方式会更简单点,因为父类提供了实现的方法,子类如果不想扩展,那就不用管。如果使用回调机制,回调的接口需要把所有可能被扩展的 方法都定义进去,这就导致实现的时候,不管你要不要扩展,你都要实现这个方法,哪怕你什么都不做,只是转调模板中已有的实现,都要写出来。?


?

2 楼 dingchao.lonton 2012-09-02   这不是就是spring的实现方法吗?

热点排行