模板模式

轉(zhuǎn):http://www.runoob.com/design-pattern/template-pattern.html

在模板模式(Template Pattern)中推溃,一個抽象類公開定義了執(zhí)行它的方法的方式/模板。它的子類可以按需要重寫方法實現(xiàn)冲粤,但調(diào)用將以抽象類中定義的方式進(jìn)行美莫。這種類型的設(shè)計模式屬于行為型模式。

介紹

意圖:定義一個操作中的算法的骨架梯捕,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟窝撵。

主要解決:一些方法通用傀顾,卻在每一個子類都重新寫了這一方法。

何時使用:有一些通用的方法碌奉。

如何解決:將這些通用算法抽象出來短曾。

關(guān)鍵代碼:在抽象類實現(xiàn),其他步驟在子類實現(xiàn)赐劣。

應(yīng)用實例:?1嫉拐、在造房子的時候,地基魁兼、走線婉徘、水管都一樣,只有在建筑的后期才有加壁櫥加?xùn)艡诘炔町悺?2咐汞、西游記里面菩薩定好的 81 難盖呼,這就是一個頂層的邏輯骨架。 3化撕、spring 中對 Hibernate 的支持几晤,將一些已經(jīng)定好的方法封裝起來,比如開啟事務(wù)植阴、獲取 Session蟹瘾、關(guān)閉 Session 等,程序員不重復(fù)寫那些已經(jīng)規(guī)范好的代碼掠手,直接丟一個實體就可以保存憾朴。

優(yōu)點:?1、封裝不變部分惨撇,擴(kuò)展可變部分伊脓。 2、提取公共代碼,便于維護(hù)报腔。 3株搔、行為由父類控制,子類實現(xiàn)纯蛾。

缺點:每一個不同的實現(xiàn)都需要一個子類來實現(xiàn)纤房,導(dǎo)致類的個數(shù)增加,使得系統(tǒng)更加龐大翻诉。

使用場景:?1炮姨、有多個子類共有的方法,且邏輯相同碰煌。 2舒岸、重要的、復(fù)雜的方法芦圾,可以考慮作為模板方法蛾派。

注意事項:為防止惡意操作,一般模板方法都加上 final 關(guān)鍵詞个少。

實現(xiàn)

我們將創(chuàng)建一個定義操作的?Game?抽象類拥刻,其中绑谣,模板方法設(shè)置為 final录煤,這樣它就不會被重寫罩息。Cricket?和?Football?是擴(kuò)展了?Game?的實體類,它們重寫了抽象類的方法茫经。

TemplatePatternDemo巷波,我們的演示類使用?Game?來演示模板模式的用法。

步驟 1

創(chuàng)建一個抽象類科平,它的模板方法被設(shè)置為 final褥紫。

Game.java

public abstract class Game {? abstract void initialize();

? abstract void startPlay();

? abstract void endPlay();

? //模板? public final void play(){

? ? ? //初始化游戲? ? ? initialize();

? ? ? //開始游戲? ? ? startPlay();

? ? ? //結(jié)束游戲? ? ? endPlay();

? }}

步驟 2

創(chuàng)建擴(kuò)展了上述類的實體類。

Cricket.java

public class Cricket extends Game {

? @Override? void endPlay() {? ? ? System.out.println("Cricket Game Finished!");

? }

? @Override? void initialize() {? ? ? System.out.println("Cricket Game Initialized! Start playing.");

? }

? @Override? void startPlay() {? ? ? System.out.println("Cricket Game Started. Enjoy the game!");

? }}

Football.java

public class Football extends Game {

? @Override? void endPlay() {? ? ? System.out.println("Football Game Finished!");

? }

? @Override? void initialize() {? ? ? System.out.println("Football Game Initialized! Start playing.");

? }

? @Override? void startPlay() {? ? ? System.out.println("Football Game Started. Enjoy the game!");

? }}

步驟 3

使用?Game?的模板方法 play() 來演示游戲的定義方式瞪慧。

TemplatePatternDemo.java

public class TemplatePatternDemo {? public static void main(String[] args) {

? ? ? Game game = new Cricket();

? ? ? game.play();

? ? ? System.out.println();

? ? ? game = new Football();

? ? ? game.play();? ? ?

? }}

步驟 4

執(zhí)行程序髓考,輸出結(jié)果:

Cricket Game Initialized! Start playing.Cricket Game Started. Enjoy the game!Cricket Game Finished!Football Game Initialized! Start playing.Football Game Started. Enjoy the game!Football Game Finished!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市弃酌,隨后出現(xiàn)的幾起案子氨菇,更是在濱河造成了極大的恐慌,老刑警劉巖妓湘,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件查蓉,死亡現(xiàn)場離奇詭異,居然都是意外死亡榜贴,警方通過查閱死者的電腦和手機(jī)豌研,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鹃共,你說我怎么就攤上這事鬼佣。” “怎么了霜浴?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵晶衷,是天一觀的道長。 經(jīng)常有香客問我阴孟,道長晌纫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任永丝,我火速辦了婚禮锹漱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘类溢。我一直安慰自己凌蔬,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布闯冷。 她就那樣靜靜地躺著,像睡著了一般懈词。 火紅的嫁衣襯著肌膚如雪蛇耀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天坎弯,我揣著相機(jī)與錄音纺涤,去河邊找鬼。 笑死抠忘,一個胖子當(dāng)著我的面吹牛撩炊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崎脉,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼拧咳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了囚灼?” 一聲冷哼從身側(cè)響起骆膝,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灶体,沒想到半個月后阅签,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡蝎抽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年政钟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡养交,死狀恐怖精算,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情层坠,我是刑警寧澤殖妇,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站破花,受9級特大地震影響谦趣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜座每,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一前鹅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峭梳,春花似錦舰绘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孵运,卻和暖如春秦陋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背治笨。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工驳概, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旷赖。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓顺又,卻偏偏與公主長得像,于是被迫代替她去往敵國和親等孵。 傳聞我的和親對象是個殘疾皇子稚照,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 模板模式 在模板模式(Template Pattern)中,一個抽象類公開定義了執(zhí)行它的方法的方式/模板流济。它的子類...
    小陳阿飛閱讀 166評論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法锐锣,類相關(guān)的語法,內(nèi)部類的語法绳瘟,繼承相關(guān)的語法雕憔,異常的語法,線程的語...
    子非魚_t_閱讀 31,669評論 18 399
  • 1糖声、概念介紹模版方法模式的結(jié)構(gòu) 定義一個操作中算法的框架斤彼,而將一些步驟延遲到子類中分瘦,使得子類可以不改變算法的結(jié)構(gòu)即...
    William8閱讀 426評論 0 1
  • 初步認(rèn)知 模板模式:抽象類中,有一個主方法琉苇,再定義1…n個方法嘲玫,可以是抽象的,也可以是實際的方法并扇。定義一個類去团,繼承...
    _Mocuishle閱讀 790評論 0 0
  • 她被父親遺棄在修道院自己野蠻而頑強(qiáng)地生長肴熏。 她從帽子開始建立起自己龐大的時尚王國鬼雀。 她終身未嫁,直到50歲還充滿魅...
    有你在就好閱讀 194評論 0 0