1. 程式人生 > >設計模式(十八)---模板方法模式

設計模式(十八)---模板方法模式

strac string package style prim res 不同的 好的 clas

1、簡介

  模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩余的邏輯。

  不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。這就是模板方法模式的用意。

2、模板方法結構

  模板方法模式是所有模式中最為常見的幾個模式之一,是基於繼承的代碼復用的基本技術。

  代表這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本方法匯總起來的方法叫做模板方法(template method),這個設計模式的名字就是從此而來。

  模板方法所代表的行為稱為頂級行為,其邏輯稱為頂級邏輯。

3、模板方法類圖

技術分享

4、模板方法涉及的角色

  4.1、抽象模板角色:定義了一個或多個抽象操作,以便讓子類實現。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟,定義並實現了一個模板方法。

     這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也有可能調用一些具體方法。

  4.2、具體模板角色:實現父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。每一個抽象模板角色都可以有任意多個具體模板角色與之對應,

     而每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏輯的實現各不相同。

5、源代碼

  5.1、抽象模板角色 

package TemplateMethod;
/**
 * ********************************************************  
* @ClassName: AbstractPerson 
* @Description: 抽象模板角色
*  
**********************************************************
 */
public abstract class AbstractPerson {
    //抽象類定義整個流程骨架  
    public void
prepareGotoSchool(){ dressUp(); eatBreakfast(); takeThings(); } //以下是不同子類根據自身特性完成的具體步驟 protected abstract void dressUp(); protected abstract void eatBreakfast(); protected abstract void takeThings(); }

  5.2、具體模板角色1

package TemplateMethod;
/**
 * ********************************************************  
* @ClassName: ConcreteClass 
* @Description: 具體模板角色 
*  
**********************************************************
 */
public class Student extends AbstractPerson{
     @Override  
     protected void dressUp() {  
          System.out.println("穿校服");  
     }  
     @Override  
     protected void eatBreakfast() {  
          System.out.println("吃媽媽做好的早飯");  
     }  
  
     @Override  
     protected void takeThings() {  
          System.out.println("背書包,帶上家庭作業和紅領巾");  
     }  
}

  5.3、具體模板角色2

package TemplateMethod;
/**
 * ********************************************************  
* @ClassName: Teacher 
* @Description: 具體模板類 
*  
**********************************************************
 */
public class Teacher extends AbstractPerson{
    @Override  
    protected void dressUp() {  
         System.out.println("穿工作服");  
    }  
    @Override  
    protected void eatBreakfast() {  
         System.out.println("做早飯,照顧孩子吃早飯");  
    }  
 
    @Override  
    protected void takeThings() {  
         System.out.println("帶上昨晚準備的考卷");  
    }  
}

  5.4、測試客戶端

package TemplateMethod;
/**
 * ********************************************************  
* @ClassName: Client 
* @Description: 模板方法模式測試客戶端
*  
**********************************************************
 */
public class Client {
     public static void main(String[] args) {  
         Student student = new Student();
         student.prepareGotoSchool();  
      
         Teacher teacher  = new Teacher();  
         teacher.prepareGotoSchool();  
         }  
}

6、測試,運行結果如下

技術分享

7、總結

  子類可以置換掉父類的可變部分,但是子類卻不可以改變模板方法所代表的頂級邏輯。

設計模式(十八)---模板方法模式