模板方法模式

模板方法模式 

  • 模板方法模式:定義一個算法中的操做框架,而將一些步驟延遲到子類中。使得子類能夠不改變算法的結構便可重定義該算法的某些特定步驟。(Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure)

  • 模板方法模式的通用類圖很是簡單,僅僅使用了Java的繼承機制,但它是一個很是普遍的模式。其類圖以下,其中AbstractClass叫作抽象模板,它的方法分爲兩類:
    • 基本方法:是由子類實現的方法,而且在模板方法被調用。(通常都加上final關鍵字,防止被覆寫)
    • 模板方法:能夠有一個或幾個,通常是一個具體方法,也就是一個框架,實現對基本方法的調用,完成固定的邏輯。(抽象模板中的基本方法儘可能設計爲protected類型,符合迪米特法則,不須要暴露的屬性或方法儘可能不要設置爲protected類型。實現類若非必要,儘可能不要擴大父類中的訪問權限)

 

    • 上述通用類圖的源碼以下:
    • 複製代碼
      public abstract class AbstractClass { protected abstract void doAnything(); protected abstract void doSomething(); public final void templateMethod(){ /* * 調用基本方法,完成相關的邏輯 */ this.doAnything(); this.doSomething(); } } public class ConcreteClass1 extends AbstractClass { @Override protected void doAnything() { // TODO Auto-generated method stub //子類實現具體  } @Override protected void doSomething() { // TODO Auto-generated method stub  } } public class ConcreteClass2 extends AbstractClass { @Override protected void doAnything() { // TODO Auto-generated method stub //子類實現具體  } @Override protected void doSomething() { // TODO Auto-generated method stub  } }
      複製代碼

       

  • 模板方法模式的優勢

    • 封裝不變部分,擴展可變部分。把認爲不變部分的算法封裝到父類中實現,而可變部分的則能夠經過繼承來繼續擴展。
    • 提取公共部分代碼,便於維護。
    • 行爲由父類控制,子類實現。
  • 模板方法模式的缺點

    • 按照設計習慣,抽象類負責聲明最抽象、最通常的事物屬性和方法,實現類負責完成具體的事務屬性和方法,可是模板方式正好相反,子類執行的結果影響了父類的結果,會增長代碼閱讀的難度。
  • 模板方法模式的使用場景

    • 多個子類有共有的方法,而且邏輯基本相同
    • 重要、複雜的算法,能夠把核心算法設計爲模板方法,周邊的相關細節功能則由各個子類實現
    • 重構時,模板方法是一個常常使用的方法,把相同的代碼抽取到父類中,而後經過構造函數約束其行爲。
  • 模板方法模式的擴展

如上通用類圖中,若在ConcreteClass2中不想執行doSomething()方法,那麼須要對模板方法作一些修改,其通用類圖以下:算法

 

    • 通用類圖的源碼以下:
    • 複製代碼
      public abstract class AbstractClass { protected abstract void doAnything(); protected abstract void doSomething(); protected boolean isDoSomething(){ //父類方法返回真 return true; } public final void templateMethod(){ /* * 調用基本方法,完成相關的邏輯 */ this.doAnything(); if(this.isDoSomething()) this.doSomething(); } } public class ConcreteClass1 extends AbstractClass { private boolean isDoSth; @Override protected void doAnything() { // TODO Auto-generated method stub //子類實現具體  } @Override protected void doSomething() { // TODO Auto-generated method stub  } protected void setDo(boolean isDo){ this.isDoSth = isDo; } protected boolean isDoSomething(){ return isDoSth; } }
      複製代碼

       

  • 最佳實踐

模板方法模式是經過父類創建框架,子類在重寫了父類部分方法以後,在調用從父類繼承的方法,產生不一樣的效果,經過修改子類,影響父類行爲的結果,模板方法在一些開源框架中應用很是多,它提供了一個抽象類,而後開源框架寫了一堆子類,若是須要擴展功能,能夠繼承此抽象類,而後覆寫protected基本方法,而後在調用一個相似TemplateMethod()的模板方法,完成擴展開發。框架

相關文章
相關標籤/搜索