設計乙個系統時知道了演算法所需的關鍵步驟,而且確定了這些步驟的執行順序,但某些步驟的具體實現還未知,或者說某些步驟的實現與具體的環境相關。
去銀行辦理業務一般要經過以下4個流程:取號、排隊、辦理具體業務、對銀行工作人員進行評分等,其中取號、排隊和對銀行工作人員進行評分的業務對每個客戶是一樣的,可以在父類中實現,但是辦理具體業務卻因人而異,它可能是存款、取款或者轉賬等,可以延遲到子類中實現。
模板方法模式的定義如下:定義乙個操作中的演算法骨架,而將演算法的一些步驟延遲到子類中,使得子類可以不改變該演算法結構的情況下重定義該演算法的某些特定步驟。它是一種類行為型模式。
該模式的主要優點如下:
它封裝了不變部分,擴充套件可變部分。它把認為是不變部分的演算法封裝到父類中實現,而把可變部分演算法由子類繼承實現,便於子類繼續擴充套件。
它在父類中提取了公共的部分**,便於**復用。
部分方法是由子類實現的,因此子類可以通過擴充套件方式增加相應的功能,符合開閉原則。
該模式的主要缺點如下:
對每個不同的實現都需要定義乙個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象。
父類中的抽象方法由子類實現,子類執行的結果會影響父類的結果,這導致一種反向的控制結構,它提高了**閱讀的難度。
1.模式的結構
模板方法主要包含以下主要角色。
(1)抽象類: 負責給出乙個演算法的輪廓和骨架。它由乙個模板方法和若干個基本方法構成。
(特殊說明:鉤子方法是指,在抽象方法中已經實現,包括用於判斷的邏輯方法和需要子類重寫的空方法)(2)具體子類:實現抽象類中所定義的抽象方法和鉤子方法,它們是乙個頂級邏輯的乙個組成步驟。
2.模式的實現
(1)抽象類:
/**
* 模板方法模式:
* 定義乙個操作中的演算法骨架,而將演算法的一些步驟延遲到子類中,使得子類可以不改變該演算法結構的情況下重定義該演算法的某些特定步驟。
* 它是一種類行為型模式。
*/public
abstract
class
templatemethod
queue()
;dosomething()
;mark()
;}//取號
public
void
getnum()
//鉤子方法--是否排隊
public
boolean
isqueue()
//排隊
public
void
queue()
//辦理業務
public
abstract
void
dosomething()
;//評分
public
void
mark()
}
(2)具體子類:
public
class
templatemethodimpl
extends
templatemethod
@override
public
void
dosomething()
}
總的來說,模板方法模式簡單的理解和學習還是比較淺顯易懂的,但是更加深層次的應用還是需要經驗加持。回顧工作後回顧設計模式的第一課,暫時這樣子結尾,也告訴自己要養成寫博文的習慣。 模板設計模式 PHP設計模式之模板方法模式
模板方法模式,也是我們經常會在不經意間有會用到的模式之一。這個模式是對繼承的最好詮釋。當子類中有重複的動作時,將他們提取出來,放在父類中進行統一的處理,這就是模板方法模式的最簡單通俗的解釋。就像我們平時做專案,每次的專案流程實都差不多,都有調研 開發 測試 部署上線等流程。而具體到每個專案中,這些流...
設計模式之模板方法設計模式
父類抽象出子類共有的方法,子類實現各自不同的業務。總之就是一種行為有他們共同的方法,只是他們具體的實現不一樣。比如開車這種行為模式,啟動 換擋 踩油門。每種型號品牌的車都有共同的行為,但是不同型號品牌的車的實現方式可能不同,需要每個品牌型號的車自己實現這些功能。這樣的定義上面行為的模式,稱之為模板方...
設計模式之模板方法模式
定義 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟 型別 行為類模式 事實上,模板方法是程式設計中乙個經常用到的模式。比如,給定乙個整數陣列,把陣列中的數由大到小順序,然後把排序之後的結果列印出來。這個需求大體可以分為兩部分,...