轉(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!