zoukankan      html  css  js  c++  java
  • 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)…………

  • 相关阅读:
    【转】css解决兼容的问题
    【转】.NET完美实现伪静态页面,URLRewriter.dll下载
    【技术贴】网站首页浏览量统计代码,适合.NET||网页浏览量计数器代码
    js过滤空格回车
    男人帮所有手机铃声下载|左永邦手机铃声下载,顾小白手机铃声下载,米琪手机铃声下载,艾米手机铃声下载
    孙红雷男人帮全集迅雷下载
    【技术帖】Mysql The 'InnoDB' feature is disabled; you n
    周杰伦2011所有歌曲完整版无删节全正版打包免费下载 http://115.com/file/bhr
    红警95 3D重置版 下载地址|3D95红警下载地址
    周杰伦2011所有歌曲完整版无删节全正版打包免费下载 http://115.com/file/bhr
  • 原文地址:https://www.cnblogs.com/cao-lei/p/8334918.html
Copyright © 2011-2022 走看看