GOF23设计模式之模板方法模式(template method)

1、模板方法模式概述

  模板方法模式是编程中常常使用的模式。它定义了一种操做中的算法架构,将某些步骤延迟到子类中实现。这样,新的子类能够在不改变一个算法结构的前提下从新定义该算法的某些特定步骤。算法

  (1)核心:数据库

      处理某个流程的代码已经都定义好了,可是其中某个节点的代码暂时不能肯定,所以,采用模板方法模式,将这个节点的代码转移到子类完成。编程

    即:处理步骤在父类中定义好,具体实现延迟到子类中定义。架构

  (2)何时采用模板方法模式?ide

      实现一个算法,总体步骤很固定,可是,某些部分须要常常改变,因此把这部分抽象出来,供子类实现。单元测试

2、模板方法模式场景导入

  客户到银行办理业务:测试

    (1)取号排队this

    (2)办理具体取款/存款/理财等业务lua

    (3)反馈评分spa

  第一步和第三步固定,第二步易变,因此采用模板方法模式实现。

3、模板方法模式示例代码

 1 /**
 2  * 抽象的模板方法类
 3  * @author CL
 4  *
 5  */
 6 public abstract class BankTemplateMethod {
 7     /**
 8      * 具体实现方法:排队取号
 9      */
10     public void takeNumber() {
11         System.out.println("排队取号");
12     }
13 
14     /**
15      * 抽象方法:办理业务
16      * 钩子方法
17      */
18     public abstract void transact();
19     
20     /**
21      * 具体方法:反馈评分
22      */
23     public void evaluate() {
24         System.out.println("反馈评分");
25     }
26     
27     /**
28      * 模板方法,将全部操做组合起来,通常子类不能重写
29      */
30     public final void process() {
31         this.takeNumber();
32         
33         this.transact();    //钩子方法。执行时,挂在哪一个子类的方法上就执行哪一个方法
34         
35         this.evaluate();
36     }
37 }
 1 /**
 2  * 取款业务
 3  * @author CL
 4  *
 5  */
 6 public class DrawMoney extends BankTemplateMethod {
 7 
 8     @Override
 9     public void transact() {
10         System.out.println("我要取款");
11     }
12 
13 }

  测试:

 1 /**
 2  * 测试模板方法模式
 3  * @author CL
 4  *
 5  */
 6 public class Client {
 7 
 8     public static void main(String[] args) {
 9         //模板方法模式的三种实现方式
10         
11         //第一种    
12         BankTemplateMethod btm = new DrawMoney();
13         btm.process();
14         
15         System.out.println("---------------------");
16         //第二种     使用匿名内部类
17         BankTemplateMethod btm2 = new BankTemplateMethod() {
18             
19             @Override
20             public void transact() {
21                 System.out.println("我要存款");
22             }
23         };
24         
25         btm2.process();
26         
27         System.out.println("---------------------");
28         
29         //第三种    
30         new BankTemplateMethod() {
31             
32             @Override
33             public void transact() {
34                 System.out.println("我要理财");
35             }
36             
37         }.process();
38     }
39 }
排队取号
我要取款
反馈评分
---------------------
排队取号
我要存款
反馈评分
---------------------
排队取号
我要理财
反馈评分

4、方法回调(钩子方法)

  (1)好莱坞原则 (Don't call me, we'll call you back)

  (2)在软件开发中,咱们能够将call翻译为调用。子类不能调用父类,而经过父类调用子类。这些调用步骤已经在父类中写好,彻底由父类控制整个过程。

5、模板方法模式常见开发应用场景

  (1)数据库访问的封装;

  (2)servlet 中关于 doGet / doPost 方法调用;

  (3)Junit 单元测试;

  (4)Hibernate 中模板程序;

  (5)Spring 中 JDBCTemplate、HibernateTemplate 等;

  (6)…………