开发中常见的场景

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

  • 数据库访问的封装

  • Junit单元测试

  • servlet中关于doGet/doPost方法调用

  • Hibernate中模板程序

  • spring中JDBCTemplate,HibernateTemplate等

场景

  • 客户到银行办理业务

    • 取号排队

    • 办理具体现金/转账/企业/个人/理财业务

    • 给银行工作人员评分

知道流程,但是具体的方法还不确定

模板方法模式介绍

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

核心

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

方法回调(钩子方法)

  • 好莱坞原则:"Dont't call me,we'll call you back"

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

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

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

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

Code

public abstract class BankTemplateMethod {
    //具体方法
    public void takeNumber(){
        System.out.println("排队取号");
    }

    public abstract void transact();//办理具体的业务 //钩子方法

    public void evaluate(){
        System.out.println("反馈评分");
    }

    //模板方法
    public final void process(){
        this.takeNumber();
        this.transact();
        this.evaluate();
    }
}
public class Client {

    public static void main(String[] args) {
        BankTemplateMethod btm = new DrawMoney();
        btm.process();

        BankTemplateMethod btm2 = new BankTemplateMethod() {

            @Override
            public void transact() {
                System.out.println("我要存钱!");
            }
        };
        btm2.process();

    }

}

class DrawMoney extends BankTemplateMethod{

    @Override
    public void transact() {
        System.out.println("我要取款!");
    }

}

策略模式和模板方法的区别