本文移到垃圾桶,参考 3.3 模板方法模式(5.10)。
2.1.5 模板方法+回调
模板方法模式将整个流程中不变的部分和可变的部分有效分开后(这是前提),模板方法定义执行流程,不变的部分由父类提供(可复用的)代码,可变的部分由子类延迟实现。
如果在分层结构中,Sup所定义的abstract方法和空方法,都属于回调接口。如果处理step2()的方式数以千计,可变的部分由独立的子类延迟实现并非合理的选择。此时,可以使用策略模式(可以将Sup作为策略类,也可以)将Sup作为环境类,而设计函数接口HandleStep2来处理step2(),由应用程序员提供HandleStep2的子类。
package method.templateMethod;
import static tool.Print.*;
public class Sup2{
private void step1(){ pln("step1"); }
//public void step2(){}
private void step3(){pln("step3"); }
//使用回调
public final void template2(HandleStep2 h){
step1();
h.step2();
step3();
}
}
package method.templateMethod
public interface HandleStep2{// Java8中设计成函数接口
void step2();
}
package method.templateMethod
public class Test{
public static void test2(){
Sup2 s = new Sup2();
s.template2(new HandleStep2(){
@Override public void step2(){
System.out.println("step2()");
}
});
}
}
ps:GoF使用钩子和好莱坞法则介绍本模式,一个简单的东西被他们说得云山雾绕。总之,我刚看5.10时就半天没有看懂。鄙视自己。
使用C#的程序员处理回调更舒服,可以用λ表达式。
Java 8,也可以用λ表达式了。