本文源自【人生之旅_諳憶的部落格】
我們先這樣來想象乙個生活中的場景,
就是我們在銀行櫃檯進行辦理業務的時候,會進行這幾步:
step1:進門取號
step2:填寫單據
step3:等待叫號
step4:視窗辦理
在這裡,無論是你我還是他/她,都會遵循這個模板進行業務的辦理!
我們具體看step2,銀行是無法知道我們的資訊的,所以無法由銀行具體實現了,所以留下介面,需要我們自己去實現。
現在我們再繼續看下去
模板方法模式是類的行為模式。準備乙個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。
比如定義乙個操作中的演算法的骨架,將步驟延遲到子類中。模板方法使得子類能夠不去改變乙個演算法的結構即可重定義演算法的某些特定步驟。
前面那個例子可以這樣用圖來描述:
簡單明瞭,就是step2自己去具體實現。
package com.chenhaoxiang.template;
/** * 抽象基類 為所有子類提供乙個演算法框架
* * 提神飲料
* *@author chenhaoxiang
* */
public
abstract
class
refreshbeverage
/*** 基本方法:將水煮沸
*/private
void
boilwater()
/*** 抽象的基本方法
* 泡製飲料
* 注意訪問許可權為protected
*/protected
abstract
void
brew();
/*** 通用方法
* 將飲料倒入杯中
*/private
void
pourincup()
/*** 抽象的基本方法
* 加入調味料
*/protected
abstract
void
addcondiments();
}
package com.chenhaoxiang.template;
/** * 具體子類
* 提供了咖啡製備的具體實現
* *@author chenhaoxiang
* */
public
class
coffee
extends
refreshbeverage
@override
protected
void
addcondiments()
}
package com.chenhaoxiang.template;
/** * 具體子類
* 提供了製備茶的具體實現
*@author chenhaoxiang
* */
public
class
teaextends
refreshbeverage
@override
protected
void
addcondiments()
}
package com.chenhaoxiang.template;
public
class
refreshbeveragetest
}
結果:
看上面**實現的步驟:
1、把水煮沸
2、泡飲料
3、把飲料倒入杯子
4、加調味品
上面的**中,我們的子類是必須進行上面的4步的,因為那是在我們的模板方法中定義的。
如果我們不需要加調味品呢,這個時候就需要引入鉤子方法的概念了。
對上面的**進行變化
未寫的是未進行修改的類
package com.chenhaoxiang.template;
/** * 抽象基類 為所有子類提供乙個演算法框架
* * 提神飲料
* *@author chenhaoxiang
* */
public
abstract
class
refreshbeverage
}/**
* 鉤子(hook)函式
* 提供乙個預設或空的實現
* 具體的子類可以自行決定是否掛鉤以及如何掛鉤
* (讓子類選擇性的可以鉤或者不鉤中實現)
* 詢問使用者是否需要加入調料
*@return
*/protected
boolean
iscustomerwantscondiments()
/*** 基本方法:將水煮沸
*/private
void
boilwater()
/*** 抽象的基本方法
* 泡製飲料
* 注意訪問許可權為protected
*/protected
abstract
void
brew();
/*** 通用方法
* 將飲料倒入杯中
*/private
void
pourincup()
/*** 抽象的基本方法
* 加入調味料
*/protected
abstract
void
addcondiments();
}
package com.chenhaoxiang.template;
/** * 具體子類
* 提供了製備茶的具體實現
*@author chenhaoxiang
* */
public
class
teaextends
refreshbeverage
@override
protected
void
addcondiments()
/*** 子類通過覆蓋的形式選擇掛載鉤子函式並且提供了乙個符合自己需求的實現
*/@override
protected
boolean
iscustomerwantscondiments()
}
演示結果:
抽象基類:
1、基本方法
我們知道所有的子類的實現細節都是一樣的,具有共性的
可以直接在基類中定義實現
2、抽象方法
對於只知道原則而不知道細節的方法
3、可選鉤子函式
只在基類中提供預設或者空的實現,由子類來選擇是否使用鉤子
4、template方法
把前面的方法按照一定順序來執行,寫成模板方法。
注意,該方法一定要寫成final!
也就是,你不能改變基類規定的基本原則,執行順序!
具體子類:
1、實現基類中的抽象方法
執行子類的個性化行為
2、可選擇覆蓋鉤子方法
可更加個性化的來影響區域性行為
模板方法的適用場景:
1、演算法或操作遵循相似的邏輯
例如上面**樣例中的茶和咖啡,對飲料的泡製具有相似的邏輯,所以可以抽象成模板方法,供所有子類使用!
2、重構時(把相同的**抽取到父類中)
新功能加入時
3、重要、複雜的演算法,核心演算法設計為模板演算法
本文源自【人生之旅_諳憶的部落格】
JAVA 設計模式之模板模式
模板模式 提供通用模板,高度抽象將通用演算法封裝,暴露子類物件特有演算法重寫。簡述直接上demo 通用模板類 package com.coamc.android.api.template version v 2.0.0 title bankte package com.coamc.android.a...
java設計模式之模板模式
模板模式是類的行為模式。準備乙個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。比如定義乙個操作中的演算法的骨架,將步驟延遲到子類中。模板方法使得...
Java設計模式之模板模式
從名字上看模板模式與元型模式有點像,但實際上它們有很大的不同。元型模式是建立系列中的模式,它的實現是先為類建立乙個例項,然後對這個例項進行初化,並當成是元型。以後再需要這個類的例項時,不再是從頭開始new,而是從已有的元型clone。當然,元型可能不只乙個,這個時候就要用集合類進行管理了,在clon...