概念與定義
在模板模式(Template Pattern)中眉踱,一個(gè)抽象類(lèi)公開(kāi)定義了執(zhí)行它的方法的方式/模板寥殖。它的子類(lèi)可以按需要重寫(xiě)方法實(shí)現(xiàn)舟奠,但調(diào)用將以抽象類(lèi)中定義的方式進(jìn)行儒洛。
即先定義一個(gè)抽象類(lèi)蔚携,該抽象類(lèi)中定義一個(gè)模板方法希太,在該模板方法中,定義算法的步驟酝蜒,而每一個(gè)步驟中的具體實(shí)現(xiàn)誊辉,可以在該抽象類(lèi)中實(shí)現(xiàn),也可以交給子類(lèi)去實(shí)現(xiàn)亡脑。
簡(jiǎn)單示例
public abstract class Game {
//模板方法
public final void play(){
//初始化游戲
initialize();
//開(kāi)始游戲
startPlay();
//結(jié)束游戲
endPlay();
}
//具體實(shí)現(xiàn)抽象出來(lái)交給子類(lèi)實(shí)現(xiàn)
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
}
子類(lèi)實(shí)現(xiàn)具體步驟:
//足球
public class Football extends Game {
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
}
//羽毛球
public class Badminton extends Game {
@Override
void initialize() {
System.out.println("Badminton Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Badminton Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Badminton Game Finished!");
}
}
模板的寫(xiě)法
- 模板方法:定義算法骨架的方法
-
具體的操作:在模板中直接實(shí)現(xiàn)某些步驟的方法堕澄。通常這些步驟的實(shí)現(xiàn)算法是固定的,而且是不怎么變化的霉咨,因此可以將其當(dāng)做公共功能實(shí)現(xiàn)在模板中蛙紫。如果不需要子類(lèi)提供訪(fǎng)問(wèn)這些方法的話(huà),還可以是
private
的途戒。 - 具體的AbstractClass操作:在模板中實(shí)現(xiàn)某些公共功能坑傅,可以提供給子類(lèi)使用,一般不是具體的算法步驟的實(shí)現(xiàn)喷斋,而是一些輔助的公共功能唁毒。
- 原語(yǔ)操作:就是在模板中定義的抽象方法蒜茴,通常是模板方法需要調(diào)用的操作,是必須的操作浆西,而且在父類(lèi)中還沒(méi)有辦法確定下來(lái)粉私,需要子類(lèi)來(lái)真正實(shí)現(xiàn)的方法。
- 鉤子操作:在模板中定義近零,并提供默認(rèn)實(shí)現(xiàn)的操作毡鉴。這些方法通常被視為可擴(kuò)展的點(diǎn),但不是必須的秒赤。
- Factory Method:在模板方法中猪瞬,如果需要得到某些對(duì)象實(shí)例的話(huà),可以考慮通過(guò)工廠(chǎng)方法模式來(lái)獲取入篮,把具體構(gòu)建對(duì)象的實(shí)現(xiàn)延遲到子類(lèi)中去陈瘦。
模板模式的本質(zhì)
模板方法模式主要是通過(guò)制定模板,把算法步驟固定下來(lái)潮售,至于誰(shuí)來(lái)實(shí)現(xiàn)痊项,模板可以自己提供實(shí)現(xiàn),也可以由子類(lèi)去實(shí)現(xiàn)酥诽,還可以通過(guò)回調(diào)機(jī)制讓其他類(lèi)來(lái)實(shí)現(xiàn)鞍泉。
通過(guò)固定算法骨架來(lái)約束子類(lèi)的行為,并在特定的擴(kuò)展點(diǎn)來(lái)讓子類(lèi)進(jìn)行功能擴(kuò)展肮帐,從而讓程序既有很好地復(fù)用性咖驮,又有較好的擴(kuò)展性。
模板方法模式很好地體現(xiàn)了設(shè)計(jì)原則中的開(kāi)閉原則和里式替換原則训枢。
內(nèi)容文字摘抄自《研磨設(shè)計(jì)模式》