模板方法是結構最簡單的行為型設計模式,在抽象類中定義了一個稱為模板方法的方法,在這個方法中定義其他基本方法的執行步驟,而基本方法的實作可以放在抽象類,也可以放在其子類
模式動機
現實生活中很多事情的完成程序都包含幾個基本步驟,例如請客吃飯,無論吃什么,一般都包含點單、吃東西、買單幾個步驟,到底吃什么則具體情況具體分析,在實際環境中由用戶動態決定,
既然這幾個步驟的次序是固定的,于是我們創建一個新的方法叫“請客”,在其中呼叫了點單、吃東西和買單,同時指定它們的執行次序,我們稱這個“請客”為模板方法,“點單”、“吃東西”、“買單”都是“請客”程序中的一個步驟,它們稱為基本方法,其中“吃東西”可以有多種吃法,如吃飯、吃面條、吃燒烤,因此需要提供不同的“吃東西”方法的實作,
假設用代碼實作上述方法,我們可以把相同代碼放在父類,如“點單”和“買單”,而將不同方法實作放在不同的子類,如“吃東西”,這樣一來提高了代碼的復用性,還可以利用面向物件的多型性,這就是模板方法模式的模式動機,
模式定義
定義一個操作中演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重新定義該演算法的某些特定步驟
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.
模式分析
模板方法模式是基于繼承的代碼復用基本技術,先在抽象類的模板方法中指定執行步驟,將相同步驟對應的方法在抽象父類中實作,而不同的步驟只在抽象父類中進行宣告,由于面向物件的多型性,子類中定義的方法將覆寫父類中定義的方法,因此程式運行時,具體子類的基本方法將覆寫父類中定義的基本方法,實作特定的演算法,
不過,雖然說子類覆寫了父類的方法實作業務邏輯,但實際上是由父類來控制整個程序,即子類不需要呼叫父類,而通過父類來呼叫子類,
由此得模式結構類圖如下:

抽象類(AbstractClass)中定義一系列基本操作(primitiveOperation),這些基本操作可以是具體的,也可以是抽象的,每一個基本操作對應演算法的一個步驟,在其子類中可以重定義并實作一個演算法的各個步驟,同時在抽象類中實作了一個模板方法(templateMethod),用于定義一個演算法的骨架,呼叫基本操作,
具體子類(ConcreteClass)用于實作在父類中定義的抽象基本操作以完成子類特定演算法的步驟,也可以覆寫在父類中實作的具體基本操作,
基本方法是實作各個步驟的方法,是模板方法的組成部分,基本方法又可以分為三種:
-
抽象方法
一個抽象方法由抽象類宣告,由其具體子類實作
-
具體方法
一個具體方法由一個抽象類或具體類宣告并實作,其子類可以進行覆寫
-
鉤子方法
一個鉤子方法由一個抽象類或具體類宣告并實作,而其子類可能會加以擴展,通常在父類中給出的實作是一個空實作,作為該方法的默認實作,當然也可以提高一個非空的默認實作,
鉤子方法有兩類,一類是可以控制具體步驟的執行,比如說我們希望在不同條件下執行模板方法中的不同步驟,就可以定義一個回傳型別為布林值的鉤子方法,用于進行條件判斷,如果條件滿足則執行某一步驟,否則某一步驟不執行
public void template() { open(); display(); if(isPrint()) { print(); } } public boolean isPrint(){ return true; }如果不希望方法執行,可以在其子類在覆寫鉤子方法,修改回傳值即可,
還有一類鉤子方法是實作體為空的具體方法,子類根據需要覆寫或繼承它們,與抽象方法相比,鉤子方法的好處在于如果沒有覆寫父類中定義的抽象方法,編譯仍可以通過,
模式優缺點
模板方法模式的優點:
- 可以在一個類中形式化地定義演算法,而由它的子類實作細節的處理
- 模板方法模式是一種代碼復用的基本技術,在類別庫設計中尤其重要,它提取類別庫中的公共行為,將公共行為放在父類,通過子類來實作不同的行為
- 通過一個父類呼叫其子類的操作,通過對子類的擴展增加新的行為,符合開閉原則
模板方法模式的缺點:
- 每個不同的實作都需要定義一個子類,將會導致類的個數增加
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/6015.html
標籤:設計模式
上一篇:策略模式
下一篇:解釋器模式
