1. 程式人生 > >設計模式-----模板模式

設計模式-----模板模式

模板模式

模板模式的定義

定義一個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟

通用類圖:

這裡寫圖片描述

為了防止惡意的操作,一般模板方法都加上final關鍵字,不允許被覆寫。

抽象模板中的基本方法儘量設計為protected型別,符合迪米特法則,不需要暴露 的屬性或方法儘量不要設定為protected型別。實現類若非必要,儘量不要擴大父類中的訪問
許可權

模板方法的應用

目前我們要生產一些模型,我們將模型進行抽象化

這裡寫圖片描述

非常簡單,HummerModel中我們抽象模型的具體方法,然後再具體實現類中將方法進行實現。

public class HummerH1Model extends HummerModel {     //H1型號的悍馬車鳴笛     
public void alarm() {             System.out.println("悍馬H1鳴笛...");     
}     
//引擎轟鳴聲     
public void engineBoom() {             System.out.println("悍馬H1引擎聲音是這樣的...");     
}     
//汽車發動     
public void start() {             System.out.println("悍馬H1發動..."
); } //停車 public void stop() { System.out.println("悍馬H1停車..."); } //開動起來 public void run(){ //先發動汽車 this.start(); //引擎開始轟鳴 this.engineBoom(); //然後就開始跑了,跑的過程中遇到一條狗擋路,就按喇叭 this.alarm(); //到達目的地就停車 this.stop(); } }
public class HummerH2Model extends HummerModel {     //H2型號的悍馬車鳴笛     
public void alarm() {             System.out.println("悍馬H2鳴笛...");     }     
//引擎轟鳴聲     
public void engineBoom() {             System.out.println("悍馬H2引擎聲音是這樣在...");     }     //汽車發動     
public void start() {             System.out.println("悍馬H2發動...");     }       
//停車     
public void stop() {             
System.out.println("悍馬H2停車...");     }       
//開動起來     
public void run(){             //先發動汽車             this.start();                           //引擎開始轟鳴             this.engineBoom();                      //然後就開始跑了,跑的過程中遇到一條狗擋路,就按喇叭             this.alarm();                           //到達目的地就停車             
this.stop();     }
 }

在上述程式碼中,我們發現兩個具體模型的run方法是一模一樣的,對此我們進行重構,將run方法重構到HummerModel 中,具體的模型就不需要再次進行實現。

模板方法的優點

  1. 封裝不可變部分,擴充套件可擴充套件部分
  2. 提取公共部分程式碼,便於維護
  3. 行為由父類控制,子類實現

模板方法的缺點

抽象類負責宣告最抽象、最一般的事物屬性和方法,實現類完成
具體的事物屬性和方法。但是模板方法模式卻顛倒了,抽象類定義了部分抽象方法,由子類實現,子類執行的結果影響了父類的結果,也就是子類對父類產生了影響

模板方法模式的使用場景

  • 多個子類有公有的方法,並且邏輯基本相同時
  • 重要、複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細節功能則由各個子類實現
  • 重構時,模板方法模式是一個經常使用的模式,把相同的程式碼抽取到父類中