一.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 接口回调 18 上机实践5 字符串、时间与数字 19 实验1 String类的常用方法 19 实验2 比较日期的大小 21 实验3 处理大整数 22 上机实践6 组件及事件处理 23 实验1 算术测试 23 实验2 信号灯 25 实验3 布局与...
Channel选择器工厂与轮询算法及注册底层实现 72_Netty线程模型深度解读与架构设计原则 73_Netty底层架构系统总结与应用实践 74_Netty对于异步读写操作的架构思想与观察者模式的重要应用 75_适配器模式与模板方法模式...
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...
75_适配器模式与模板方法模式在入站处理器中的应用 76_Netty项目开发过程中常见且重要事项分析 77_Java NIO Buffer总结回顾与难点拓展 78_Netty数据容器ByteBuf底层数据结构深度剖析 79_Netty的ByteBuf底层实现大...
第75讲:适配器模式与模板方法模式在入站处理器中的应用 第76讲:Netty项目开发过程中常见且重要事项分析 第77讲:Java NIO Buffer总结回顾与难点拓展 第78讲:Netty数据容器ByteBuf底层数据结构深度剖析 第79讲...
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...
onUpload:文件上传成功回调函数 参数值:成功后需要执行的函数 说明:这个函数执行时返回的值为上传程序返回的msg变量,可能为字符串或者数组,若为字符串则直接代表url,若是数组,则必需包含一个url的变量,其它...
7. Db->add()方法中对_after_insert()回调的处理依赖last_insert_id, 对无自增id的表则无法处理 8. TagLibCx中compiler()方法对标签的处理, literal编号只有一位数字, 当模板中标签超过10个时, 导致模板无法展现. ...
执行回调 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。使用基于...
•抽象类与模板模式。 接口的概念 •接口定义的是多个类共同的行为规范,这些行为是与外部交流的通道,这就意味着接口里通常是定义一组公用的 方法。 •接口体现了规范与实现分离的设计。 接口...
7. Db->add()方法中对_after_insert()回调的处理依赖last_insert_id, 对无自增id的表则无法处理 8. TagLibCx中compiler()方法对标签的处理, literal编号只有一位数字, 当模板中标签超过10个时, 导致模板无法展现. ...
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...
修复优化支付宝当面付协议支付成功不回调的问题,已优化至 http 和 https 方式均可正常回调自动适配 优化当面付支付页面,显示充值订单号及充值的账号显示 优化删除每次进入网站时出现的,顶部 done!弹窗 优化...
再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术、自定义持久化实现、Hibernate回调与拦截...
告警策略自发现:Web界面、支持策略模板、模板继承和覆盖、多种告警方式、支持回调动作。告警设置人性化:支持最大告警次数、告警级别设置、告警恢复通知、告警暂停、不同时段不同阈值、支持维护周期,支持告警合并...
executor:如果成功获取数据,则用于在与回调不同的线程中执行交互器。 ui:与布局相关的类。 演示者:交互者和布局(片段或活动)之间的桥梁。 管理片段行为。 view:查看相关界面。版权版权所有2014 rakawm。 ...