一. 什么是模板模式
- 模板方法设计模式: 在一个方法中书写逻辑架构, 其中某些步骤实现不确定因此推迟到子类中实现. 即模板模式可以让算法架构不发生更改的情况下, 让子类重新定义某些步骤
- 模板模式的框架
public abstract class AbstractClass {
public final void templateMethod() {
//...
method1();
//...
method2();
//...
}
protected abstract void method1();
protected abstract void method2();
}
public class ConcreteClass1 extends AbstractClass {
@Override
protected void method1() {
//...
}
@Override
protected void method2() {
//...
}
}
public class ConcreteClass2 extends AbstractClass {
@Override
protected void method1() {
//...
}
@Override
protected void method2() {
//...
}
}
AbstractClass demo = ConcreteClass1();
demo.templateMethod();
二. 模板模式的作用
- 复用: 所以子类可以复用父类中提供的模板方法代码
- 扩展: 模板模式提供功能扩展点, 让框架用户在不修改框架源码的情况下, 基于扩展点定制化框架的功能
三. 回调
- 模板基于继承, 回调基于组合实现扩展点
回调在功能上, 也能实现代码复用和提供扩展点, 让框架用户在不修改框架源码的情况下, 基于扩展点定制化框架的功能. 不同的是模板基于继承模板类的方式实现扩展点, 而回调基于组合的方式实现. 对于面向对象语言, 可以直接把回调函数作为参数掺入方法, 从而实现回调; 而 java 因为没有函数对象, 所有传入的是包含回调函数的接口
public interface ICallback {
void methodToCallback();
}
public class BClass {
public void process(ICallback callback) {
//...
callback.methodToCallback();
//...
}
}
public class AClass {
public static void main(String[] args) {
BClass b = new BClass();
b.process(new ICallback() { //回调对象
@Override
public void methodToCallback() {
System.out.println("Call back me.");
}
});
}
}
- 同步回调和异步回调
上述代码模式是同步回调, 即在函数返回之前执行回调函数. 异步回调指在函数返回后执行回调函数. 同步函数看起来更像模板模式, 异步回调看起开更像观察者模式;
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("I am clicked.");
}
});
从代码结构上看, 事件监听很像回调, 即作为参数传递一个回调函数对象给另一个函数. 从应用场景上看, 又很像观察者模式, 即先注册观察者OnClickListener
网友评论