定義操做中的算法框架,而將具體的操做定義延遲到子類中實現,使得子類在不改變算法結構的狀況下依然能夠從新定義 算法的某些特定步驟
理解:就像是書的目錄,老師已經制定好書的章節,分配給學生按照目錄完成書籍,學生按照本身的知識填寫目錄內容
模板方法應用普遍,也比較簡單,僅僅使用了Java的繼承機制 AbstractParentClass 稱爲抽象模板,抽象模板中的方法分爲兩類: · 基本方法:由子類實現的方法, · 模板方法:通常是一個具體的方法,也就是一個算法框架(調用邏輯),實現對基本方法調度,完成固定邏輯 AClass 和 BClass 稱爲具體模板:主要是實現抽象模板中的基本方法 注意:爲了防止惡意操做,模板方法通常都加final關鍵字 基本方法儘可能設計成protected類型(符合迪米特法則:不須要暴露的屬性和方法儘可能設置爲protected類型),若非必要不要擴大 方法的訪問權限
· 封裝不變部分,擴展可變部分算法
把認爲不可變的部分封裝到父類實現,可變部分則能夠經過繼承來繼續擴展
· 提取公共部分代碼,便於維護框架
· 行爲由父類控制,子類實現ide
按照設計習慣通常是定義抽象後實現,但模板方法模式定義了部分實現,子類的實現改變告終果,帶來了閱讀上難度
1. 多個子類有相同的方法,且邏輯基本相同 2. 重要複雜的算法,可把核心算法封裝爲模板方法 3. 重構時
public abstract class AbstractCommand { /** * HOOK METHOD * @return */ protected abstract boolean pre() ; protected abstract void after() ; protected abstract void run(); public final void executeRun(){ if(pre()){ run(); after(); } } }
public class ACommand extends AbstractCommand { @Override protected boolean pre() { return true; } @Override protected void after() { System.out.println("執行了A after()"); } @Override protected void run() { System.out.println("執行了A run()"); } }
public class BCommand extends AbstractCommand { @Override protected boolean pre() { return false; } @Override protected void after() { System.out.println("執行了B after()"); } @Override protected void run() { System.out.println("執行了B run()"); } }
public class Test { public static void main(String[] args) { ACommand a = new ACommand(); BCommand b = new BCommand(); a.executeRun(); b.executeRun(); } }
增長鉤子方法(Hook Method) 當須要增長外部條件時,增長鉤子方法便可改變執行結果