模板方法模式示意性代码如下.
下面定义的是抽象模板类:
public abstract class AbstractFatherClass { /** * 模板方法的声明与实现 */ public void templateMethod() { // 调用基本方法 this.doOperation1(); // 调用基本方法 this.doOperation2(); this.doOperation3(); } /** * 基本方法的声明 (此方法让此抽象类的子类实现) */ protected abstract void doOperation1(); /** * 基本方法的声明 (此方法让此抽象类的子类实现) */ protected abstract void doOperation2(); private final void doOperation3() { // dosometing } }
我们可以看到上面的代码中 doOperation1()和doOperation2()这两个基本方法在抽象模板类并没有实现,而是交给子类(具体模板类)去实现。
接下来定义具体模板类,具体模板角色主要实现抽象模板角色声明的抽象方法
public class ConcreteClass extends AbstractFatherClass { /** * 实现抽象父类声明的抽象方法 */ @Override protected void doOperation1() { System.out.println("doOperation1 method"); } /** * 实现抽象父类声明的抽象方法 */ @Override protected void doOperation2() { System.out.println("doOperation2 method"); } }
上面的具体模板类实现了父类声明的基本方法doOperation1(),doOperation2()。
模板方法模式可以用一句很简单的话来表达:在父类的一个方法中定义一个算法的骨架,把具体的留给子类去做。
至于应该在什么阶段把处理分开来,哪些处理交给父类,哪些处理交给子类,这个要看实际情况然后去运用。
可以说模板方法模式是面向对象三大特性:继承,封装,多态 最简单的体现。