定義:模板方法模式是在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
類圖:這裡涉及到兩種角色:
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 ...