一、简介
模板方法模式就是定义一个算法骨架,而将算法骨架中的一些步骤延伸到子类中去,使得子类可以不改变一个算法的结构,即可重新定义该算法的某些特定步骤。这里需要复用的是算法的结构,也就是步骤,而步骤的实现可以在子类中完成。
模板方法特点如下:
模板方法模式的组成
模板方法模式的类图如下:
二、示例
父类角色:
1 package com.templatemothed; 2 3 /** 4 * 父类角色 5 */ 6 public abstract class AbstractTemplate { 7 8 /** 9 * 模板方法:定义算法骨架(相关步骤的执行顺序);该方法不能被子类重写 10 */ 11 public final void templateMethod() { 12 step1(); 13 System.out.println("from Parent Class"); 14 step2(); 15 } 16 17 /** 18 * 步骤一,需要子类去实现 19 */ 20 public abstract void step1(); 21 22 /** 23 * 步骤二、需要子类去实现 24 */ 25 public abstract void step2(); 26 }
子类角色:
1 package com.templatemothed; 2 3 /** 4 * 子类角色 5 */ 6 public class ConcreteTemplate extends AbstractTemplate { 7 8 /** 9 * 实现父类的模板方法中的步骤一方法 10 */ 11 public void step1() { 12 System.out.println("step1 from subClass"); 13 } 14 15 /** 16 * 实现父类的模板方法中的步骤二方法 17 */ 18 public void step2() { 19 System.out.println("step2 from subClass"); 20 } 21 }
调用类:
package com.templatemothed; public class Test { public static void main(String[] args) { // 创建调用对象 AbstractTemplate template = new ConcreteTemplate(); // 调用父类的模板方法 template.templateMethod(); } }
调用template 从父类继承的ConcreteTemplate()方法,ConcreteTemplate()方法就会调用子类实现的step1()和step2()方法。这样step1()与step2()方法的执行顺序已经在父类中定义好了,子类执行实现这两个方法。当调用父类的模板方法的时候,这两个方法就会按照父类模板方法定义的流程依次执行。
模板方法模式在许多开源框架中得到应用。如spring framework中对事务的相关处理就使用到了模板方法模式。spring对jpa,hibernate,jdbc都提供了支持。 AbstractPlatformTransactionManager 用到了模板方法设计模式,许多具体的数据库层继承了该类(如DatasourceTransactionManager、HibernateTransactionManager等)。该类将各个具体的相关的代码抽象出来。进行数据库操作的时候,首先会获取事务,然后进行数据库操作,最后按照数据操作的结果,选择进行事务提交或是回滚。这些事务的获取,事务的提交,与回滚都是在子类(如果DatasourceTransactionManager、HibernateTransactionManager这些类)中去实现的。
原文:http://www.cnblogs.com/always-online/p/4287946.html