它的定義為:定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重新定義該演算法的某些特定步驟。說的通俗一點,就是為子類設計乙個模板以便於子類復用裡面的方法。為了避免子類惡意修改方法的實現細節,一般模板方法模式都會在方法上加final。
我們以泡茶和衝咖啡為例子。
步驟1 將水煮沸
boilwater();
//步驟2 泡製飲料(加茶葉或者咖啡)
brew();
//步驟3 將飲料倒入杯中
pourincup();
if(iscustomerwantscondiments())
} /*
* hook, 鉤子函式,提供乙個預設或空的實現
* 具體的子類可以自行決定是否掛鉤以及如何掛鉤
* 詢問使用者是否加入調料
*/protected boolean iscustomerwantscondiments()
/* * 基本方法,將水煮沸
*/private void boilwater()
/** 基本方法,將飲料倒入杯中
*/private void pourincup()
/** 抽象的基本方法,泡製飲料
*/protected abstract void brew();
/* * 抽象的基本方法, 加入調味料
*/protected abstract void addcondiments();
}preparebeveragetemplate就是模板演算法,是final.因為模板是不可以隨意改變的,所以子類不能改變它。
因為boilwater() & pourincup在子類中都是相同的,所以設定為private
其他方法在子類中不同,所以設定為protected 子類才能重寫它。
另外有個
protected boolean iscustomerwantscondiments()
這叫鉤子函式,因為我們不知道第四個步驟到底要不要加。如果要,那就像鉤子一樣把第四個方法勾住它。
如果不要那就覆寫它
protected boolean iscustomerwantscondiments()
這樣在if(iscustomerwantscondiments())
中返回就是 false
來看看子類繼承
package com.imooc.pattern.template;
/* * 具體子類,提供了咖啡製備的具體實現
*/public class coffee extends refreshbeverage
@override
protected void addcondiments()
}
沒有覆寫iscustomerwantscondiments 那就預設要使用第四個方法
/*
* 具體子類,提供了製備茶的具體實現
*/public class tea extends refreshbeverage
@override
protected void addcondiments()
@override
/* * 子類通過覆蓋的形式選擇掛載鉤子函式
* @see com.imooc.pattern.template.refreshbeverage#iscustomerwantscondiments()
*/protected boolean iscustomerwantscondiments()
}
可以看到,它不需要第四個方法
最後看下測試**
public class refreshbeveragetest
}
設計模式(八) 模板方法模式
設計模式 八 模板方法模式 這幾天雜七雜八的事有點多,停了幾日,今日繼續,今天講最簡單的模板方法,但是卻是用的比較廣泛的。首先來明確下概念吧,模板方法的寫法是這樣,準備乙個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式...
設計模式學習(八) 模板方法模式
這是個人學習程式設計模式的系列學習筆記第八篇。採用qt creator進行編寫,但盡量採用c 基礎語法。模板方法模式 template method 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。如果有乙個場景,從高層次來...
設計模式學習(八)模板方法模式
在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。別呼叫我們,我們會呼叫你。也就是高層元件來決定什麼時候呼叫低層元件。我們需要製作咖啡和茶。咖啡的製作步驟 1.把水煮沸 2.用沸水沖泡咖啡 3.把咖啡倒入杯子 4....