protected boolean hookMethod() {
return true;
}
}
class ConcreteMethodA extends AbstractMethod{
protected void method1() {
System.out.println("子类 A :method1() ...");
}
protected void method2() {
System.out.println("子类 A :method2() ...");
}
}
class ConcreteMethodB extends AbstractMethod{
protected void method1() {
System.out.println("子类 B :method1() ...");
}
protected void method2() {
System.out.println("子类 B :method2() ...");
}
//覆盖钩子方法
protected boolean hookMethod() {
return false;
}
}
public class Client {
public static void main(String[] args) {
AbstractMethod methodA = new ConcreteMethodA();
methodA.templateMethod();
AbstractMethod methodB= new ConcreteMethodB();
methodB.templateMethod();
}
}
测试结果:
|
子类 A :method1() ...
子类 B :method1() ...
子类 B :method2() ...
|
至此,模板方法模式就简单地实现了,我们明白到抽象类AbstactMethod中的模板方法实际上是提供了一个外部可访问的接口,外部环境由该接口进入获得服务,而AbstractMethod类在此将子类可能提供不同服务给封装隐藏起来,即延迟了某些具体服务的细节,由其子类来负责实现。
另外,钩子方法的合理使用也可以使得模板方法模式更加灵活,不至于被templateMethod()简单地限制着,请参看上面例子的代码实现和测试结果。