`
kim_miao
  • 浏览: 188606 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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


 

3
2
分享到:
评论
4 楼 静夜独窗 2019-03-01  
你确定你这个回调对应的是模板方法模式,而不是策略模式?
3 楼 LyAn_爱踢爱死 2016-04-06  
那个Context是哪个包下的。
2 楼 dingchao.lonton 2012-09-02  
这不是就是spring的实现方法吗?
1 楼 lh870003574 2012-09-01  
嗯,总结的好。
如果将模板方法与回调结合起来,无疑将更加强大。不知楼主有没看过Spring的源代码?Spring对Hibernate,JDBC的封装就是将两者结合起来了,非常方便用户。

相关推荐

    Java 2实用教程(第三版)实验指导与习题解答

    实验3 接口回调 18 上机实践5 字符串、时间与数字 19 实验1 String类的常用方法 19 实验2 比较日期的大小 21 实验3 处理大整数 22 上机实践6 组件及事件处理 23 实验1 算术测试 23 实验2 信号灯 25 实验3 布局与...

    精通并发与 netty 视频教程(2018)视频教程

    Channel选择器工厂与轮询算法及注册底层实现 72_Netty线程模型深度解读与架构设计原则 73_Netty底层架构系统总结与应用实践 74_Netty对于异步读写操作的架构思想与观察者模式的重要应用 75_适配器模式与模板方法模式...

    java 面试题 总结

    Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...

    精通并发与netty视频教程(2018)视频教程

    75_适配器模式与模板方法模式在入站处理器中的应用 76_Netty项目开发过程中常见且重要事项分析 77_Java NIO Buffer总结回顾与难点拓展 78_Netty数据容器ByteBuf底层数据结构深度剖析 79_Netty的ByteBuf底层实现大...

    精通并发与netty 无加密视频

    第75讲:适配器模式与模板方法模式在入站处理器中的应用 第76讲:Netty项目开发过程中常见且重要事项分析 第77讲:Java NIO Buffer总结回顾与难点拓展 第78讲:Netty数据容器ByteBuf底层数据结构深度剖析 第79讲...

    超级有影响力霸气的Java面试题大全文档

     Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...

    xheditor-1.1.14

    onUpload:文件上传成功回调函数 参数值:成功后需要执行的函数 说明:这个函数执行时返回的值为上传程序返回的msg变量,可能为字符串或者数组,若为字符串则直接代表url,若是数组,则必需包含一个url的变量,其它...

    ThinkPHP Core 3.0源代码分析

    7. Db-&gt;add()方法中对_after_insert()回调的处理依赖last_insert_id, 对无自增id的表则无法处理 8. TagLibCx中compiler()方法对标签的处理, literal编号只有一位数字, 当模板中标签超过10个时, 导致模板无法展现. ...

    springMongodb参考文档中文版

    执行回调 9.18。GridFS支持 9.19。更改流 9.19.1。使用MessageListener更改流 9.19.2。更改流 - 无效 10.反应性的MongoDB支持 10.1。入门 10.2。使用Spring和Reactive Streams Driver连接到MongoDB 10.2.1。使用基于...

    【05-面向对象(下)】

    •抽象类与模板模式。 接口的概念 •接口定义的是多个类共同的行为规范,这些行为是与外部交流的通道,这就意味着接口里通常是定义一组公用的 方法。 •接口体现了规范与实现分离的设计。 接口...

    ThinkPHP Core 3.0源代码分析(免积分)

    7. Db-&gt;add()方法中对_after_insert()回调的处理依赖last_insert_id, 对无自增id的表则无法处理 8. TagLibCx中compiler()方法对标签的处理, literal编号只有一位数字, 当模板中标签超过10个时, 导致模板无法展现. ...

    asp.net知识库

    Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1) -- 异步WebService调用 ASP.NET 2.0页面框架的几点新功能 ASP.NET 2.0 中收集的小功能点 asp.net2.0中的webpart使用小记 2.0问题、错误解决办法 ASP.NET 2.0...

    最新觅知扶风视频解析计费系统源码V1.8.2 免授权优化版 附教程.zip

    修复优化支付宝当面付协议支付成功不回调的问题,已优化至 http 和 https 方式均可正常回调自动适配 优化当面付支付页面,显示充值订单号及充值的账号显示 优化删除每次进入网站时出现的,顶部 done!弹窗 优化...

    夏昕.深入浅出Hibernate

    再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截...

    安卓java发送qq邮件完整源码-golang-open-source-projects:golang-开源项目

    安卓java发送qq邮件完整源码 ...告警策略自发现:Web界面、支持策略模板、模板继承和覆盖、多种告警方式、支持回调动作。告警设置人性化:支持最大告警次数、告警级别设置、告警恢复通知、告警暂停、不同时段不同阈值、

    MvpTemplate:使用MVP(Model-View-Presenter)模式的Android基本项目

    executor:如果成功获取数据,则用于在与回调不同的线程中执行交互器。 ui:与布局相关的类。 演示者:交互者和布局(片段或活动)之间的桥梁。 管理片段行为。 view:查看相关界面。版权版权所有2014 rakawm。 ...

Global site tag (gtag.js) - Google Analytics