一.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.使用模板方法模式使用继承方式会更简单点,因为父类提供了实现的方法,子类如果不想扩展,那就不用管。如果使用回调机制,回调的接口需要把所有可能被扩展的 方法都定义进去,这就导致实现的时候,不管你要不要扩展,你都要实现这个方法,哪怕你什么都不做,只是转调模板中已有的实现,都要写出来。
分享到:
相关推荐
`JdbcTemplate`执行SQL查询时,会调用用户提供的回调方法来处理结果集,这类似于同步回调,因为结果处理在查询完成后立即进行,与模板模式的应用场景相似。 总的来说,回调函数和模板模式都是为了实现代码的复用和...
在Spring框架中,模板模式和回调模式是两种重要的设计模式,它们被广泛应用于处理各种不同的任务,如数据访问、远程调用等。这两种模式都旨在提高代码的可扩展性和复用性,使得开发者能够以更加灵活的方式处理业务...
本主题将深入探讨Spring框架中的JdbcTemplate组件,以及模板模式和回调机制的概念。 **1. Spring JdbcTemplate** JdbcTemplate是Spring提供的一个用于简化数据库操作的API,它是Spring对JDBC(Java Database ...
Java 模板方法设计模式定义 Java 模板方法设计模式是指在软件...Java 模板方法设计模式是通过回调机制来实现算法的可扩展性和灵活性的设计模式。该模式的使用场景广泛,例如在 Web Service 和 RMI 等领域都有应用。
2. `execute(TransactionCallback callback)`: 这个方法接收一个回调接口,实际的业务逻辑在回调的`doInTransaction()`方法中实现。这样,我们可以在回调方法中执行数据库操作,而无需关心事务的开启和关闭。 3. `...
例如,在一个图形用户界面的框架中,可能有一个模板方法负责处理用户的点击事件,其中包含了一系列步骤:获取点击位置、检查目标组件、执行组件的回调方法等。这些步骤在框架中是固定的,但每个组件的响应逻辑(抽象...
3. **钩子方法(Hook Method)**:这些是可选的回调方法,子类可以决定是否覆盖它们。在模板方法中,钩子方法可能被调用,以便在特定步骤执行前后插入自定义逻辑。 4. **具体类(Concrete Classes)**:实现抽象类...
在Java中,它常用于实现回调机制和事件驱动编程。 15. **解释器模式**:给定一个语言,定义它的文法表示,并提供一个解释器,该解释器使用该表示来解释语言中的句子。在Java中,它可用于实现简单的解析器,如表达式...
下面将详细探讨Spring模板模式的原理、应用以及接口回调的概念。 **模板模式** 是一种行为设计模式,它定义了算法的骨架,并允许在特定步骤中延迟或定制某些行为。在Spring框架中,模板类通常负责执行网络请求、...
这些模式提供了处理算法变体、事件处理、回调机制等常见问题的有效手段。 在"cn700_jc4479966333"这个文件中,我们可以期待找到关于这些设计模式的具体实现和示例。通过学习和理解这些模式,开发者可以更好地理解和...
模板模式与Callback回调函数的主要区别在于,模板模式在父类中固定了执行流程,而回调函数则是在运行时动态决定执行的逻辑。 3. 原型模式:原型模式是一种创建型设计模式,通过复制现有的对象来创建新的对象。在...
Java的很多框架,如Spring,都使用了模板方法模式来实现回调逻辑。 此外,书中还会讨论软件架构设计的关键原则,如单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)和接口隔离原则...
Java.util.Observable和java.util.Observer接口就是对观察者模式的内置支持,常用于事件处理和回调机制。 5. 装饰器模式:装饰器模式允许动态地给对象添加新的行为或职责,而不影响其他对象。在Java I/O系统中,...
在Java中,回调函数通常表现为接口,一个对象实现了该接口,然后将自身作为参数传递给另一个对象,后者在适当的时候调用这个接口的方法。 总的来说,这个“DesignPatterns”压缩包为学习和实践Java设计模式提供了...
书中还可能涵盖了一些与Java特性紧密相关的模式,比如使用接口实现策略模式,利用Java的动态代理实现回调机制。此外,书中可能还会涉及如何在实际项目中应用设计模式,如在企业级应用开发中,MVC(模型-视图-控制器...
4. 模板方法模式:定义操作步骤,子类可以重写部分步骤,例如Activity的生命周期回调方法。 5. 策略模式:封装算法族,使它们可以互换,如Android中的Loader管理异步加载策略。 6. 适配器模式:将不同接口的对象...
**模板方法模式**是设计模式中的一种行为模式,它允许我们在父类中定义一个算法的框架,...在实际开发中,我们可以在框架、库或者基础组件中找到模板方法模式的应用,例如各种框架的回调机制,数据库操作的CRUD模板等。
然而,Collections.sort()的实现并非严格意义上的模板模式,因为它使用了回调机制,即Comparator接口,而不是继承一个基类并重写模板方法。这种实现方式更接近于策略模式,因为Comparator可以看作是排序策略的封装,...
例如,Java的接口在实现策略模式时起到关键作用,枚举类型可以简化单例模式的实现,而动态代理则在实现回调和事件处理时发挥作用。 文件名中的"下载说明.htm"和"使用必读.txt"可能是作者或出版社提供的阅读指南,...