設計模式(4)-模板方法模式詳解(易懂)

模板方法模式定義

模板方法模式(Template Method Pattern):定義一個操做中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。模板方法是一種類行爲型模式。算法

image

從模型圖來看,模板方法模式很簡單,可是很經常使用。抽象模板(AbstractClass)中的方法基本分兩類:設計模式

  • 基本方法:子類去實現的方法 ,而且在模板方法中被調用。
  • 模板方法:把基本操做方法組合在一塊兒造成一個總算法或一個總行爲的方法;一個抽象類能夠有任意多個模板方法,而不限於一個。每個模板方法均可以調用任意多個具體方法。

具體模板(ConcreteClass)主要是實現父類定義的抽象的基本方法。微信


模板方法模式實例+擴展

例子:給兩種手機作測試的,測試包括「開機,檢查,關機」三種操做。下面用具體的代碼來講明:ide

1.抽象類測試

public abstract class TestModel  {

   //開機
   protected abstract  void open();
   //檢查
   protected abstract  void check();
   //關閉
   protected abstract  void close();
   //模板方法-測試
   public void  test(){
       this.open();;
       this.check();
       this.close();
   }
}

2.兩個實現類Phone1,Phone2this

public class Phone1 extends  TestModel {
   @Override
   protected void open() {
       System.out.println("phone1的開機邏輯");
   }

   @Override
   protected void check() {
       System.out.println("phone1的檢查邏輯");
   }

   @Override
   protected void close() {
       System.out.println("phone1的關機邏輯");
   }
}

public class Phone2 extends TestModel {
   @Override
   protected void open() {
       System.out.println("phone2的開機邏輯");
   }

   @Override
   protected void check() {
       System.out.println("phone2的檢查邏輯");
   }

   @Override
   protected void close() {
       System.out.println("phone2的關機邏輯");
   }
}

3.調用spa

TestModel testModel1=new Phone1();
TestModel testModel2=new Phone2();

       testModel1.test();
       testModel2.test();

運行的結果以下:設計

image

二.擴展code

若是phone1在測試中須要關機,而phone2不須要關機,這時須要一個鉤子方法rem

1.抽象類

public abstract class TestModel  {

   //開機
      protected abstract  void open();
   //檢查
   protected abstract  void check();
   //關閉
   protected abstract  void close();
   //模板方法-測試
   public void  test(){
       this.open();;
       this.check();
       if (isClose()){
           this.close();   
       }

   }

   //鉤子方法,默認是關機
   protected  boolean  isClose(){
       return  true;
   }
}

2.實現類

public class Phone1 extends  TestModel {
   public   boolean  isClose=true;

   public  void  setIsClose(boolean isClose){
       this.isClose=isClose;
   }

   protected  boolean  isClose(){
       return this.isClose;
   }
   @Override
   protected void open() {
       System.out.println("phone1的開機邏輯");
   }

   @Override
   protected void check() {
       System.out.println("phone1的檢查邏輯");
   }

   @Override
   protected void close() {
       System.out.println("phone1的關機邏輯");
   }

}

public class Phone2 extends TestModel {
   @Override
   protected void open() {
       System.out.println("phone2的開機邏輯");
   }

   @Override
   protected void check() {
       System.out.println("phone2的檢查邏輯");
   }

   @Override
   protected void close() {
       System.out.println("phone2的關機邏輯");
   }

   //由於是取消關機,因此直接返回false就能夠了
   protected  boolean  isClose(){
       return false;
   }
}

3.調用

Phone1 testModel1=new Phone1();
       Phone2 testModel2=new Phone2();
    //phone1
       testModel1.setIsClose(true);
       testModel1.test();
    //phone2
       testModel2.test()

模板方法模式的優缺點及應用

1.優勢

  • 封裝不變部分,擴展可變的部分。
  • 提取了公共的代碼,減小代碼量,方便維護。
  • 父類控制方法,子類去實現。

2.缺點

  • 代碼的閱讀難度會增長,尤爲是新手。咱們習慣認爲抽象類申明的是最抽象的、最通常的事物屬性和方法,實現類完成具體的事物屬性和方法;而在模板方法模式中,抽象類中定義了部分抽象方法,而子類實現父類後執行的結果影響了父類,子類對父類產生了影響。

3.應用

  • 重構
  • 規定算法
  • 抽取公共的邏輯

參考資料《大話設計模式》《設計模式之禪》
歡迎你們關注個人微信公衆號:安卓乾貨鋪

相關文章
相關標籤/搜索