一、場景
- 客戶到銀行辦理業務
1、取號排隊
2、辦理具體現金、轉賬、企業、個人、理財業務
3、給銀行工作人員評分
二、介紹
模版方法模式是編程中經常用到的模式。它定義了一個操作中的算法骨架,將某些步驟延遲到子類中實現。這樣,新的子類可以在不改變一個算法結構的前提下重新定義該算法的某些特定步驟
三、核心
處理某個流程的代碼已經都具備,但是其中某個節點的代碼暫時不能確定。因此,我們采用工廠方法模式,將這個節點的代碼實現轉移給子類完成。即:處理步驟父類中定義好,具體實現延遲到子類中定義。就是一個回調過程
BankTemplateMethod.java
package cn.itcast.day249.template;
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();
}
}
說明:從上面的類我們可以看到,一些固定的方法我們都已經實現,同時這些方法的調用過程(即模版)我們也已經實現,但是對于具體的業務方法需要在使用的時候去實現,此時我們只需要在子類中實現相關方法即可。
Client.java
package cn.itcast.day249.template;
public class Client {
public static void main(String[] args) {
BankTemplateMethod btm = new DrawMoney();
btm.process();//調用process方法
//更多的時候是采用匿名內部類
BankTemplateMethod btm2 = new BankTemplateMethod() {
public void transact() {
System.out.println("存錢");
}
};
btm2.process();
}
}
class DrawMoney extends BankTemplateMethod{
@Override
public void transact() {
System.out.println("取款");
}
}
說明:如上,當我們在子類實現相關的方法之后,在使用的時候父類會調用此實現。
四、使用時機
實現一個算法時,整體步驟很固定,但是,某些部分易變。易變部分可以抽象出來,供子類實現
五、開發中常見的場景
- 數據庫訪問的封裝
-
Junit
單元測試 -
servlet
中關于doGet/doPost
方法的調用 -
Hibernate
中模版程序 -
spring
中JDBCTemplate、HibernateTemplate
等