模板模式的使用场景:当我们要完成在某一个细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,可以考虑用模板方法来处理。
模板方法:在模板中,定义一个操作中算法的骨架(一般为重复的代码),而将一些步骤(不同的代码) “延迟”到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤。
模板方法的优点:模板方法通过把不变行为搬移到超类(父类),去除子类中的重复代码来实现代码的复用。
例子:
抽象模板
package TemplateMethodPattern; /** * 模板方法模式:抽象模板类 */ public abstract class AbstractTemplate { /** * 模板方法:算法的整体框架(相同的部分) */ public void templateMethod() { primitiveOperation1(); primitiveOperation2(); concreteMethod(); } /** * 申明抽象基本方法,由子类具体实现 * protected 修饰不同包的子类 */ protected abstract void primitiveOperation1(); /** * 申明抽象基本方法,由子类具体实现 */ protected abstract void primitiveOperation2(); /** * 基本方法 */ private void concreteMethod() { System.out.println("这是父类的基本方法."); } }
模板的子类实现A
package TemplateMethodPattern; public class ConcreteTemplateA extends AbstractTemplate { @Override protected void primitiveOperation1() { System.out.println("具体模板类A的实现方法1"); } @Override protected void primitiveOperation2() { System.out.println("具体模板类A的实现方法2"); } }
模板的子类实现B
package TemplateMethodPattern; public class ConcreteTemplateB extends AbstractTemplate { @Override protected void primitiveOperation1() { System.out.println("具体模板类B的实现方法1"); } @Override protected void primitiveOperation2() { System.out.println("具体模板类B的实现方法2"); } }
客户端测试
package TemplateMethodPattern; public class TestTemplateMethod { public static void main(String[] args) { AbstractTemplate abstractTemplate = new ConcreteTemplateA(); abstractTemplate.templateMethod(); abstractTemplate = new ConcreteTemplateB(); abstractTemplate.templateMethod(); } }