模板方法模式

2021-06-20 07:09:42 字數 3505 閱讀 4967

定義:模板方法模式是在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

類圖:這裡涉及到兩種角色:

1.      抽象模板:

定義了乙個或多個抽象操作,以便讓子類實現。

定義了乙個模板方法,給出了乙個頂級邏輯骨架,組裝了操作的邏輯步驟,子類不可改變。

2.      具體模板

一般有多個具體模板角色,每個模板處理不同的業務

每個具體模板都要繼承抽象模板類,實現抽象方法。

核心:子類可以替換父類的可變部分,但是不可以修改模板方法的頂級邏輯。

模式中的方法:

1.      模板方法

定義在抽象類中,把基本方法和鉤子方法組合起來的final方法,封裝了不可變的邏輯行為。

乙個抽象類可以有多個模板方法,而不限於1個。每個模板方法都可以呼叫任意多個具體方法。

2.      基本方法

基本方法分三種:

i 抽象方法:定義在父類中的方法,由子類實現

ii 具體方法:由父類宣告並實現,一般是父類私有方法。不需要子類重寫。

iii 鉤子方法:由父類定義的普通方法,子類可以重寫,也可以不重寫。通常父類會給出乙個空實現,作為方法的預設實現。

例項:abstractfridge:抽象類,定義模板方法

package com.mylearn.designmodel.template;

* created by intellij idea.

* user: yingkuohao

* date: 13-9-29

* time: 下午4:43

* descrption:

* 模板方法:主要是抽象出乙個操作流程的骨架,然後把具體的邏輯放入到子類中去。

* 場景:當乙個流程的主要流程都相似,都是經過幾步共同的操作,就可以先定義出所經歷的步驟,然後把骨架流程寫成乙個

* 方法,供客戶端呼叫。把

* to change this template use file | settings | file templates.

public abstract class abstractfridge {

* 定義模板類的骨架,核心方法,相當於乙個模板,描述好這個類及其子類要做乙個什麼事情,

* 把公用的方法直接寫好,如opendoor,closedoor。

* 把具體子類的方法抽象出來,讓子類去實現,如pushsth。

* 注意,方法被宣告為final,以免子類改進這個演算法的順序。

* @param context

final void execute(context context) {

//step1: 開啟冰箱門

opendoor();

//step2: 放入東西(大象,或者是其他)

pushsth(context);

system.out.println("這次放入冰箱的是:" + context.getname());

//step3: 關上冰箱門

closedoor();

if(hook()) {

system.out.println("hookexecute");

* 鉤子方法,子類可以選擇覆蓋

* @return

private boolean hook() {

return true;  //to change body of created methods use file | settings | file templates.

* 私有方法,子類不可動

private void opendoor() {

system.out.println("open the door of the fridge!");

* 抽象方法,子類必須實現:往冰箱裡放東西

protected abstract void pushsth(context context);

private void closedoor() {

system.out.println("close the door of the fridge!");

elephantfridge:子類——裝大象的冰箱

public class elephantfridge extends abstractfridge {

@override

public void pushsth(context context) {

context.setname("elephant");

eggfridge:子類——裝雞蛋的冰箱

public class eggfridge extends abstractfridge {

@override

public void pushsth(context context) {

context.setname("egg");

client:客戶端資訊

public class client {

public static void main(string args) {

context context = new context();

abstractfridge abstractfridge = new elephantfridge();

abstractfridge.execute(context);

context: 上下文物件

public class context {

private string name;

public context(string name) {

this.name = name;

public context() {

public string getname() {

return name;

public void setname(string name) {

this.name = name;

要點:1. 模板方法定義了演算法的步驟,把這些步驟的實現延遲到子類。

2. 模板方法模式為我們提供了一種**復用的重要技巧

3. 模板方法的抽象類可以定義具體方法、抽象方法和鉤子。

4. 抽象方法由子類來實現。

5. 鉤子是一種方法,它在抽象類中不做事,或者只做預設的事情,子類可以選擇要不要去覆蓋它。

6. 為了防止子類改變模板方法中的演算法,可以將模板方法宣告為final。

7. 好萊塢原則告訴我們,將決策權放在高層模組中,以便決定如何以及何時呼叫低層模組。

8. 你將在真實世界**中看到模板方法模式的許多變體,不要期待它們全都是一眼就可以被你認出的。

9. 策略模式和模板方法模式都封裝演算法,乙個用組合,乙個用繼承。

10. 工廠方法是模板方法的一種特殊版本。

模板方法模式

有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...

模板方法模式

模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...

模板方法模式

模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...