3.3模板方法模式2

3.3模板方法模式 

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,也可以用λ表达式了。 

3.3模板方法模式2_第1张图片

你可能感兴趣的:(3.3模板方法模式2)