GOF23设计模式之模板方法模式(template method)
一、模板方法模式概述
模板方法模式是编程中经常使用的模式。它定义了一种操作中的算法架构,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。
(1)核心:
处理某个流程的代码已经都定义好了,但是其中某个节点的代码暂时不能确定,因此,采用模板方法模式,将这个节点的代码转移到子类完成。
即:处理步骤在父类中定义好,具体实现延迟到子类中定义。
(2)什么时候采用模板方法模式?
实现一个算法,整体步骤很固定,但是,某些部分需要经常改变,所以把这部分抽象出来,供子类实现。
二、模板方法模式场景导入
客户到银行办理业务:
(1)取号排队
(2)办理具体取款/存款/理财等业务
(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 }
排队取号 我要取款 反馈评分 --------------------- 排队取号 我要存款 反馈评分 --------------------- 排队取号 我要理财 反馈评分
四、方法回调(钩子方法)
(1)好莱坞原则 (Don't call me, we'll call you back)
(2)在软件开发中,我们可以将call翻译为调用。子类不能调用父类,而通过父类调用子类。这些调用步骤已经在父类中写好,完全由父类控制整个过程。
五、模板方法模式常见开发应用场景
(1)数据库访问的封装;
(2)servlet 中关于 doGet / doPost 方法调用;
(3)Junit 单元测试;
(4)Hibernate 中模板程序;
(5)Spring 中 JDBCTemplate、HibernateTemplate 等;
(6)…………