1. 程式人生 > 實用技巧 >設計模式 - 模板方法模式 Template Method

設計模式 - 模板方法模式 Template Method

總結

該模式在父類中定義了一個“主流程方法Template Method”(或者稱作骨架方法),主流程方法包含了許多空/非空的“子方法”。這些子方法(被稱作鉤子方法),可以被不同的子類實現自己獨特的邏輯,但是又不破壞父類中的主流程方法邏輯。使得不同的子類中,“流程一致,具體邏輯不同”。

詳細解析

假設父類是一個“審批貸款”ApproveLoan,規定了一個審批貸款的主流程方法templateMethod(),包含了審批貸款的三個步驟。所有的銀行都要按照這三個步驟來操作,只不過具體的操作的邏輯不同。可以看到step1和step2是空方法,讓子類去實現自己的邏輯;step3是國家統一的規定,預設按照國家的規定操作(當然step3還是能被子類覆蓋的)。

//approve loan 審批貸款 
public abstract class ApproveLoan{
 
    //審批貸款的主流程方法
    //步驟1:提交表格
    //步驟2:稽核若干天
    //步驟3:審批通過,放款
    public void templateMethod(){
        step1();
        step2();
        step3();
    }

    //步驟1:提交表格
    public abstract void step1();
    //步驟2:稽核若干天
    public abstract void step2();
    //步驟3:審批通過,放款
    public void step3(){
        System.out.println("國家統一規定,只能放款60萬元...");
    }
}

具體的子類有招商銀行,和農業銀行。兩個銀行的前兩步不盡相同,因此如果呼叫不同的銀行物件,主流程都是這三步,但是細節是不同的。

//招商銀行
public class ZhaoShangBank extends ApproveLoan{
    @Override
    public void step1(){
        //步驟1:提交表格
        System.out.println("招商銀行,需要提交身份證影印件...");
    }

    @Override
    public void step2(){
        //步驟2:稽核若干天
        System.out.println("招商銀行,稽核5天...");
    }

}

//農業銀行
public class NongyeBank extends ApproveLoan{
    @Override
    public void step1(){
        //步驟1:提交表格
        System.out.println("農業銀行,需要提交身份證影印件+戶口本...");
    }

    @Override
    public void step2(){
        //步驟2:稽核若干天
        System.out.println("農業銀行,稽核10天...");
    }

}