模板方法模式

一、简介
  模板方法模式就是定义一个算法骨架,而将算法骨架中的一些步骤延伸到子类中去,使得子类可以不改变一个算法的结构,即可重新定义该算法的某些特定步骤。这里需要复用的是算法的结构,也就是步骤,而步骤的实现可以在子类中完成。

  模板方法特点如下:

  • 一次性实现一个算法的不变部分,并且将可变的行为留给子类来完成。
  • 各子类公共的行为应该被提取出来并集中到一个公共父类中以避免代码的重复。首先识别现有代码的不同之处,并且把不同部分分离为新的操作,最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • 控制子类的扩展

  模板方法模式的组成

  • 父类角色:提供模板。
  • 子类角色:为模板提供实现。

  模板方法模式的类图如下:

 

 

二、示例

  父类角色:

 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这些类)中去实现的。

posted on 2015-02-13 20:40  烟火_  阅读(351)  评论(0编辑  收藏  举报

导航