设计模式GOF23--模板方法模式

场景

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

模板方法模式介绍

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

核心

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

代码实现(银行办理业务)

模板方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public abstract class BankTeplateMethod {
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();
}
}

实现取款业务

1
2
3
4
5
6
7
8
9
10
/**
* 取款业务
*/
class DrawMoney extends BankTeplateMethod{

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

调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 模板方法
*/
public class Client {
public static void main(String[] args) {
BankTeplateMethod btm = new DrawMoney();

btm.process();

//采用匿名内部类
BankTeplateMethod btm2 = new BankTeplateMethod() {
@Override
public void transact() {
System.out.println("我要存钱!!!");
}
};
btm2.process();
}
}

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

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

开发中常见的场景

  • 数据库访问的分装
  • Junit单元测试
  • servlet中关于doGet/doPost方法的调用
  • Hibernate中模板程序
  • spring中JDBCTemplate、HibTemplate等。
注:该博文为学习总结,视频来源为高淇java300集