template method
模式,模板方法模式。顧名思義,定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重新定義該演算法的某些特定步驟。說的通俗一點,就是為子類設計乙個模板以便於子類復用裡面的方法。為了避免子類惡意修改方法的實現細節,一般模板方法模式都會在方法上加final。
gof
給出的模板方法模式的定義如下:
定義乙個操作中的乙個演算法框架,把一些步驟推遲到子類去實現。模板方法模式讓子類不需要改變演算法結構而重新定義特定的演算法步驟。
結構角色:
抽象模板
具體模板
1. 場景
假如小明發過生日,朋友們給他過生日,需要給他買生日禮物。
對於買禮物的過程我們可以歸納如下:
(1)、拿錢
(2)、選擇禮物
(3)、送人
如果要用模板方法去解決這一問題,就需要將具體的三個步驟分為可變的和不可變的部分
(1)、拿錢 《不可變》
(2)、選擇禮物 《可變》
(3)、送人 《不可變》
將不可變的都放在父類中去實現,將不變放到子類中去實現。
2、**實現
生日抽象父類
/**
* @program: design-mode
* @description: 生日模板
* @author: molongyin
* @create: 2019-05-16 16:36
**/public
abstract
class
festivaltemplate
/** * 禮物送人
*/protected
final
void send (
)/**
* 選擇禮物
*/protected
abstract
void select ();
/** * 具體步驟
*/public
void birthday (
)}
蛋糕
/**
* @program: design-mode
* @description: 送蛋糕
* @author: molongyin
* @create: 2019-05-16 16:43
**/public
class
selectcake
extends
festivaltemplate
}
衣服
/**
* @program: design-mode
* @description: 送mac
* @author: molongyin
* @create: 2019-05-16 16:44
**/public
class
selectcclothes
extends
festivaltemplate
}
測試類
/**
* @program: design-mode
* @description: 客戶端
* @author: molongyin
* @create: 2019-05-16 16:47
**/public
class
client
}
執行結果
*****= 購買禮物 >>>>>
**********== 選擇禮物 : 蛋糕 ***************=
*****= 禮物送人 >>>>>
-------------------------------
*****= 購買禮物 >>>>>
**********== 選擇禮物 : mac ***************=
*****= 禮物送人 >>>>>
優點:能夠解決**冗餘問題.
把某些演算法步驟延遲到子類,子類可以根據不同情況改變/實現這些方法,而子類的新方法不會引父類已有功能的變化。
易於擴充套件.
父類提供了演算法的框架,控制方法的執行流程,而子類不能改變演算法流程,子類方法的呼叫由父類模板方法決定。
父類可以把那些重要的不允許改變的方法遮蔽掉,不讓子類覆寫(override/overwrite)它們。。
缺點模板方法也有它不足之處,過分地使用模板方法模式,往往會引起子類的氾濫。
對於模板方法的缺點我們可以使用匿名內部類的方法解決
生日模板
/**
* @program: design-mode
* @description: 生日
* @author: molongyin
* @create: 2019-05-16 17:57
**/public
class
birthtemplate
/** * 禮物送人
*/protected
final
void send (
)/**
* 過生日
*/public
void birthday (selectbirth birth)
}
抽象選擇禮物的方法
/**
* @program: design-mode
* @description: 選擇生日禮物
* @author: molongyin
* @create: 2019-05-16 17:57
**/public
inte***ce
selectbirth
測試類
/**
* @program: design-mode
* @description: test
* @author: molongyin
* @create: 2019-05-16 18:01
**/public
class
client})
; system.out.
println
(" >>>>>>>>>>>><<<<<<<<<<<<<< ");
template.
birthday
(new
selectbirth()
});}
}
結果
*****= 取錢 >>>>>
********** 選擇衣服 **********===
*****= 禮物送人 >>>>>
>>>>>>>>>>>><<<<<<<<<<<<<<
*****= 取錢 >>>>>
********** 選擇蛋糕 **********===
*****= 禮物送人 >>>>>
process finished with exit code 0
實現乙個演算法,整體步驟很固定,但是某些部分易變,易變部分可以抽象出來,供子類實現。
資料庫訪問的封裝
junit
單元測試
servlet
中doget
和dopost
方法
spring
中jdbctemplate
和hibernatetemplate
設計模式 Java設計模式之模板方法模式
本文源自 人生之旅 諳憶的部落格 我們先這樣來想象乙個生活中的場景,就是我們在銀行櫃檯進行辦理業務的時候,會進行這幾步 step1 進門取號 step2 填寫單據 step3 等待叫號 step4 視窗辦理 在這裡,無論是你我還是他 她,都會遵循這個模板進行業務的辦理!我們具體看step2,銀行是無...
JAVA設計模式之 模板方法模式
我們在生活中,很多事情都包含特定的一些步驟。如去銀行辦理業務,通常步驟的次序是 取號 填單 等待叫號 辦理業務。這幾個步驟中,有的是不變的,比如取號,每個人都要取,但有的是要變的,比如都有填單,但是根據不同的業務,填寫的單據不同。又比如我們外出吃飯,一般的步驟是 點餐 等待 吃飯 付錢,也能發現同樣...
Java設計模式之 模板方法模式
在物件導向開發過程中,通常會遇到這樣的乙個問題,我們知道乙個演算法所需的關鍵步驟,並確定了這些步驟的執行順序,但是,某些步驟的具體實現是未知的,或者說某些步驟的實現是會隨著環境的變化而改變的,例如,執行程式的流程大致如下 對於不同的程式語言,上述 4 個步驟都是不一樣的,但是,它們的執行流程是固定的...