GOF23设计模式之模板方法方式(方法回调)的理解与实现之经典

GOF23设计模式之模板方法模式(方法回调)的理解与实现之经典
GOF23设计模式之模板方法方式(方法回调)的理解与实现之经典
模板方法模式template method

     客户到银行办理业务

  1. 取号排队
  2. 办理具体业务/转账/企业/个人/理财业务
  3. 给银行工作人员评分





模板方法模式介绍:

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

核心:

     处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用工厂方法模式,将这个节点的代码的代码实现转移给子类完成。即:处理步骤父类中定义好,具体实现延迟到子类中定义。

     就像请朋友出去吃东西,首先大致流程我们是知道的,先点菜,再吃饭,再买单。这个大体的流程是知道的,只有吃饭这个环节,我们没法确定。需要到具体的环境去吃

     有时又又称这种方式为方法回调(钩子函数)

         好莱坞原则:“Don‘t call
me, we’ll call you back”

         在好莱坞,当艺人把简历递交给好莱坞的娱乐公司时,所能作的就是等待,整个过程由娱乐公司控制,演员只能被动的服务安排,在需要的时候再由公司安排具体环节的演出。

     在软件开发中,我们可以将call翻译为调用,子类不能调用父类,而通过父类调用子类。这些调用步骤已经在父类中写好了,完全由父类控制整个过程。

 

     什么时候用到模板方法模式:

         实现一个算法时,整体步骤很固定。但是,某些部分易变,易变部分可以抽象出来,供子类实现

     开发中常见的场景:

         非常频繁。各个框架,类库中都有它的影子。比如常见的有:

              数据库访问的封装

              Junit单元测试

              Servlet中关于doGet/doPost方法调用

              Awt中的paint方法调用

              Hibernate中的模板程序

              SpringJDBCTemplateHibernateTemplate
=============================================
/*
 * 抽象的银行业务类:
 * */
package com.bjsxt.templateMethod;
public abstract class BankTemplateMethod {
 private void takeNumber() {
  System.out.println("取号排队");
 }
 
 //The abstract method transaction in type
 //BankTemplateMethod can only set a visibility modifier, one of public or protected
 protected abstract void transaction();
 
 private void evaluate() {
  System.out.println("为客服评分");
 }
 
 public final void process() {
  takeNumber();
  transaction();
  evaluate();
 }
}
==============================================
package com.bjsxt.templateMethod;
public class Client {
 public static void main(String[] args) {
  BankTemplateMethod btm = new DrawMoney();
  btm.process();
  
  //匿名类,需要知道继承的父类,是一个构造函数需要有括号,需要有匿名类的类体和类体中
  //修改的函数
  BankTemplateMethod saveMoney = new BankTemplateMethod() {
   
   @Override
   protected void transaction() {
    System.out.println("我要存款!!!!存100000");
   }
  };
  saveMoney.process();
  BankTemplateMethod btm3 = new BankTemplateMethod() {
   
   @Override
   protected void transaction() {
    System.out.println("我要理财!");
   }
  };
  btm3.process();
 }
 
}
class DrawMoney extends BankTemplateMethod {
 @Override
 public void transaction() {
  System.out.println("我要取款!!!!,取100000!");
 }
 
}
/*
取号排队
我要取款!!!!,取100000!
为客服评分
取号排队
我要存款!!!!存100000
为客服评分
取号排队
我要理财!
为客服评分
 * 
 * 
 * */
=================================