(Template Method)模板方法模式的Java实现

使用场景:

通用类图如下:

我们这里的类图会详细一点,如下:

具体代码实现如下:

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()简单地限制着,请参看上面例子的代码实现和测试结果。

本文出自 “蚂蚁” 博客,请务必保留此出处

穷则思变,差则思勤!没有比人更高的山没有比脚更长的路。

(Template Method)模板方法模式的Java实现

相关文章:

你感兴趣的文章:

标签云: