使用场景:
通用类图如下:
我们这里的类图会详细一点,如下:
具体代码实现如下:
abstract class AbstractMethod { protected abstract void method1(); protected abstract void method2(); // 模板方法,统一调用上面两个在子类中会被实现的方法,香港虚拟主机,即不同的实现 public final void templateMethod() { /* * 此方法体内也可以通过“钩子方法”来实现根据一定情况调用 不同的方法组合 */ if (hookMethod()) { method1(); }else { method1(); method2(); } } // 钩子方法,protected权限可被子类覆盖,香港空间,网站空间,默认为返回true 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()简单地限制着,请参看上面例子的代码实现和测试结果。
本文出自 “蚂蚁” 博客,请务必保留此出处
穷则思变,差则思勤!没有比人更高的山没有比脚更长的路。