Java回调与模板方法模式

标签: java 回调 模板方法 | 发表时间:2012-09-01 12:36 | 作者:
出处:http://www.iteye.com

 

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


 



已有 1 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 回调 模板方法] 推荐:

Java回调与模板方法模式

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

Java回调机制

- - Java - 编程语言 - ITeye博客
1.  什么是回调函数.     回调函数(callback Function),顾名思义,用于回调的函数.   回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数. 回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机. 回调函数包含下面几个特性:.     1、属于工作流的一个部分;.

模板方法

- - 博客园_首页
由于前两天刚好用到模板方法这个模式,而且这个模式相对来 比较简单实用,就写写个人的一些认知吧. 大家对宋丹丹和赵本山的小品里有一个很经典的台词一定不会陌生,而且还日常中经常引用:. 《钟点工》中宋丹丹问要把大象装冰箱,总共分几步. 赵本山就懵了,大象那么大,冰箱那么小,怎么才能把大象装冰箱里呢. 答案也很经典:三步:第1步,把冰箱门打开;第2步,把大象装进去;第3步,把冰箱门带上.

一个经典例子让你彻彻底底理解java回调机制

- - ImportNew
以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊. 然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式:.

Java中的锁(Locks in Java)

- - 并发编程网 - ifeve.com
原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一. 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂. 因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况).

Java PaaS 对决

- 呆瓜 - IBM developerWorks 中国 : 文档库
本文为 Java 开发人员比较了三种主要的 Platform as a Service (PaaS) 产品:Google App Engine for Java、Amazon Elastic Beanstalk 和 CloudBees RUN@Cloud. 它分析了每种服务独特的技术方法、优点以及缺点,而且还讨论了常见的解决方法.

Java浮点数

- d0ngd0ng - 译言-电脑/网络/数码科技
Thomas Wang, 2000年3月. Java浮点数的定义大体上遵守了二进制浮点运算标准(即IEEE 754标准). IEEE 754标准提供了浮点数无穷,负无穷,负零和非数字(Not a number,简称NaN)的定义. 在Java开发方面,这些东西经常被多数程序员混淆. 在本文中,我们将讨论计算这些特殊的浮点数相关的结果.

Qt——转战Java?

- - 博客 - 伯乐在线
编者按:事实上,在跨平台开发方面,Qt仍是最好的工具之一,无可厚非,但Qt目前没有得到任何主流移动操作系统的正式支持. 诺基亚的未来计划,定位非常模糊,这也是令很多第三方开发者感到失望,因此将导致诺基亚屡遭失败的原因. Qt的主要开发者之一Mirko Boehm在博客上强烈讽刺Nokia裁了Qt部门的决定,称其为“绝望之举”,而非“策略变更”.

java 验证码

- - ITeye博客
// 创建字体,字体的大小应该根据图片的高度来定. // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到. // randomCode用于保存随机产生的验证码,以便用户登录后进行验证. // 随机产生codeCount数字的验证码. // 得到随机产生的验证码数字. // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同.

Java异常

- - CSDN博客推荐文章
“好的程序设计语言能够帮助程序员写出好程序,但是无论哪种语言都避免不了程序员写出坏的程序.                                                                                                                          ----《Java编程思想》.