- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java通俗易懂系列設計模式之模板模式
實(shí)際開(kāi)發(fā)中常常會(huì )遇到,代碼骨架類(lèi)似甚至相同,只是具體的實(shí)現不一樣的場(chǎng)景。例如:流程都有開(kāi)啟、編輯、駁回、結束。每個(gè)流程都包含這幾個(gè)步驟,不同的是不同的流程實(shí)例它們的內容不一樣。共享單車(chē)都是先開(kāi)鎖、騎行、上鎖、付款。這些大的步驟固定,不同的是每個(gè)實(shí)例的具體實(shí)現細節不一樣。這些類(lèi)似的業(yè)務(wù)我們都可以使用模板模式實(shí)現。為什么要使用模板模式以及如何使用呢?
定義:在模板模式(Template Pattern)中,一個(gè)抽象類(lèi)公開(kāi)定義了執行它的方法的方式/模板。它的子類(lèi)可以按需要重寫(xiě)方法實(shí)現,但調用將以抽象類(lèi)中定義的方式進(jìn)行。這種類(lèi)型的設計模式屬于行為型模式。
意圖:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi)可以不改變一個(gè)算法的結構即可重定義該算法的某些特定步驟
我們以生活中買(mǎi)菜做飯的例子來(lái)寫(xiě)個(gè)Demo,燒飯一般都是買(mǎi)菜、洗菜、烹飪、裝盤(pán)四大過(guò)程。中國自古有八大菜系,制作方式肯定都避不開(kāi)這四個(gè)過(guò)程。那在模板模式中如何實(shí)現呢?
創(chuàng )建一個(gè)抽象類(lèi),它的模板方法被設置為 final。為防止惡意操作,一般模板方法都加上 final 關(guān)鍵詞。
public abstract class AbstractCookingService { //買(mǎi)菜 protected abstract void shopping(); //清洗 protected abstract void wash(); //烹飪 protected abstract void cooking(); //裝盤(pán) protected abstract void dishedUp(); public final void process() { shopping(); wash(); cooking(); dishedUp(); } }
創(chuàng )建實(shí)現了上述抽象類(lèi)的子類(lèi)。
// 徽菜烹飪
/** * 徽菜制作大廚 */ public class HuiCaiChef extends AbstractCookingService { @Override protected void shopping() { System.out.println("買(mǎi)菜:新鮮魚(yú)一條,紅辣椒五兩"); } @Override protected void wash() { System.out.println("清洗:紅椒洗凈切片,魚(yú)頭半分"); } @Override protected void cooking() { System.out.println("烹飪:魚(yú)頭水蒸,辣椒過(guò)油"); } @Override protected void dishedUp() { System.out.println("裝盤(pán):用長(cháng)形盤(pán)子裝盛"); } }
// 川菜烹制
/** * 川菜制作大廚 */ public class HuiCaiChef extends AbstractCookingService { @Override protected void shopping() { System.out.println("買(mǎi)菜:黑豬肉一斤,蒜頭5個(gè)"); } @Override protected void wash() { System.out.println("清洗:豬肉洗凈,蒜頭去皮"); } @Override protected void cooking() { System.out.println("烹飪:大火翻炒,慢火悶油"); } @Override protected void dishedUp() { System.out.println("裝盤(pán):深碗盛起,熱油澆拌"); } }
使用 TemplatePatternDemo 類(lèi)執行模板方法 process() 來(lái)演示烹飪的定義方式。
public class TemplatePatternDemo { public static void main(String[] args) { System.out.println("----------川菜制作------------"); AbstractCookingService chuanCaiService = new ChuanCaiChef(); chuanCaiService.process(); System.out.println("-----------徽菜制作-----------"); AbstractCookingService huiCaiService = new HuiCaiChef(); huiCaiService.process(); } }
執行程序,輸出結果:
----------川菜制作------------
買(mǎi)菜:新鮮魚(yú)一條,紅辣椒五兩
清洗:紅椒洗凈切片,魚(yú)頭半分
烹飪:魚(yú)頭水蒸,辣椒過(guò)油
裝盤(pán):用長(cháng)形盤(pán)子裝盛
-----------徽菜制作-----------
買(mǎi)菜:黑豬肉一斤,蒜頭5個(gè)
清洗:豬肉洗凈,蒜頭去皮
烹飪:大火翻炒,慢火悶油
從以上實(shí)例可以看出,其實(shí)模板模式也沒(méi)什么高深莫測的,簡(jiǎn)單來(lái)說(shuō)就是三大步驟:
從以上的分析和Demo我們可以看到,模板方法提高了我們的代碼的可維護性和可擴展性。有優(yōu)點(diǎn)也有缺點(diǎn)。
優(yōu)點(diǎn):
缺點(diǎn):
每一個(gè)不同的實(shí)現都需要一個(gè)子類(lèi)來(lái)實(shí)現,導致類(lèi)的個(gè)數增加,使得系統更加龐大。
使用場(chǎng)景:
以上就是Java通俗易懂系列設計模式之模板模式的詳細內容,更多關(guān)于Java設計模式的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站