所谓模板板式,就是在父类中定义算法的主要流程,而把一些个性化的步骤延迟到子类中去实现,父类始终控制着整个流程的主动权,子类只是辅助父类实现某些可定制的步骤。
好吧,我们用代码来说话吧:
首先,父类要是个抽象类:
Java代码
public abstract class TemplatePattern {
//模板方法
public final void templateMethod(){
method1();
method2();//勾子方法
method3();//抽象方法
}
private void method1(){
System.out.println("父类实现业务逻辑");
}
public void method2(){
System.out.println("父类默认实现,子类可覆盖");
}
protected abstract void method3();//子类负责实现业务逻辑
}
父类中有三个方法,分别是method1(),method2()和method3()。
method1()是私有方法,有且只能由父类实现逻辑,由于方法是private的,所以只能父类调用。
method2()是所谓的勾子方法。父类提供默认实现,如果子类觉得有必要定制,则可以覆盖父类的默认实现。
method3()是子类必须实现的方法,即制定的步骤。
由此可看出,算法的流程执行顺序是由父类掌控的,子类只能配合。
下面我们来写第一个子类:
Java代码
public class TemplatePatternImpl extends TemplatePattern {
@Override
protected void method3() {
System.out.println("method3()在子类TemplatePatternImpl中实现了!!");
}
}
这个子类只覆盖了必须覆盖的方法,我们来测试一下:
Java代码
- TemplatePattern t1 = new TemplatePatternImpl();
- t1.templateMethod();
在控制台中我们可以看到:
Java代码
- 父类实现业务逻辑
- 父类默认实现,子类可覆盖
- method3()在子类TemplatePatternImpl中实现了!!
OK,我们来看看勾子方法的使用:
定义第2个子类,实现勾子方法:
Java代码
public class TemplatePatternImpl2 extends TemplatePattern {
@Override
protected void method3() {
System.out.println("method3()在子类TemplatePatternImpl2中实现了!!");
}
/* (non-Javadoc)
* @see com.jak.pattern.template.example.TemplatePattern#method2()
*/
@Override
public void method2() {
System.out.println("子类TemplatePatternImpl2覆盖了父类的method2()方法!!");
}
}
来测试一下:
Java代码
- TemplatePattern t2 = new TemplatePatternImpl2();
- t2.templateMethod();
我们看控制台:
Java代码
- 父类实现业务逻辑
- 子类TemplatePatternImpl2覆盖了父类的method2()方法!!
- method3()在子类TemplatePatternImpl2中实现了!!