模板方法模式是指定义一个操作中算法的骨架,而将一些步骤延迟到子类中。设计者需要给出一个算法的固定步骤,并将某些步骤的具体实现留给子类来实现。具体模板实现算法细节不会改变整个算法的骨架,但注意要将各个子类公共行为提取出来集中到一个共同的父类中以避免代码重复。
AbstractTemplate类,定义逻辑顺序并将实现过程定义为抽象方法。
public abstract class AbstractTemplate { String data; // 逻辑顺序(模式核心) public final void templateMethod() { getData(); calcData(); printData(); } // 普通方法,可能已经实现,也可能需要子类实现 abstract void getData(); abstract void calcData(); void printData() { System.out.println(data); } }Template1类继承抽象模板并具体实现:
public class Template1 extends AbstractTemplate { @Override void getData() { data = "TemplateMethod1"; } @Override void calcData() { data = "do:" + data; } }Template2类继承抽象模板并具体实现:
public class Template2 extends AbstractTemplate { @Override void getData() { data = "TemplateMethod2"; } @Override void calcData() { data = "do:" + data; } }执行过程:
AbstractTemplate template1 = new Template1(); template1.templateMethod(); AbstractTemplate template2 = new Template2(); template2.templateMethod();执行结果:
do:TemplateMethod1 do:TemplateMethod2
(注)上例中Template1和Template2的逻辑过程是一样的,只是具体实现不同。模板方法模式使用的非常广泛,只要是逻辑顺序固定但实现不同的,都可以是使用模板方法模式。