設(shè)計模式(十五)模板方法(Template Method)

模板語法.png

思想:一般只將統(tǒng)一的方法(如下面例子中的“驗證”)在父類中實(shí)現(xiàn)抛人,而將可變的方法(“登錄、注冊”)交給子類來實(shí)現(xiàn),在子類實(shí)例中可以調(diào)用父類的方法‘“驗證”來驗證子類的“登錄、注冊”)骡湖。

意圖:
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中峻厚。
TemplateMethod 使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟响蕴。
適用性:
一次性實(shí)現(xiàn)一個算法的不變的部分,并將可變的行為留給子類來實(shí)現(xiàn)惠桃。
各子類中公共的行為應(yīng)被提取出來并集中到一個公共父類中以避免代碼重復(fù)浦夷。

控制子類擴(kuò)展。模板方法只在特定點(diǎn)調(diào)用“hook ”操作刽射,這樣就只允許在這些點(diǎn)進(jìn)行擴(kuò)展军拟。
模板方法模式概述
在現(xiàn)實(shí)生活中,很多事情都包含幾個實(shí)現(xiàn)步驟誓禁,例如請客吃飯,無論吃什么肾档,一般都包含點(diǎn)單摹恰、吃東西、買單等幾個步驟怒见,通常情況下這幾個步驟的次序是:點(diǎn)單 --> 吃東西 --> 買單俗慈。在這三個步驟中,點(diǎn)單和買單大同小異遣耍,最大的區(qū)別在于第二步——吃什么闺阱?吃面條和吃滿漢全席可大不相同,如圖1所示:

圖1 請客吃飯示意圖
在軟件開發(fā)中舵变,有時也會遇到類似的情況酣溃,某個方法的實(shí)現(xiàn)需要多個步驟(類似“請客”),其中有些步驟是固定的(類似“點(diǎn)單”和“買單”)纪隙,而有些步驟并不固定赊豌,存在可變性(類似“吃東西”)。為了提高代碼的復(fù)用性和系統(tǒng)的靈活性绵咱,可以使用一種稱之為模板方法模式的設(shè)計模式來對這類情況進(jìn)行設(shè)計碘饼,在模板方法模式中,將實(shí)現(xiàn)功能的每一個步驟所對應(yīng)的方法稱為基本方法(例如“點(diǎn)單”、“吃東西”和“買單”)艾恼,而調(diào)用這些基本方法同時定義基本方法的執(zhí)行次序的方法稱為模板方法(例如“請客”)住涉。在模板方法模式中,可以將相同的代碼放在父類中钠绍,例如將模板方法“請客”以及基本方法“點(diǎn)單”和“買單”的實(shí)現(xiàn)放在父類中秆吵,而對于基本方法“吃東西”,在父類中只做一個聲明五慈,將其具體實(shí)現(xiàn)放在不同的子類中纳寂,在一個子類中提供“吃面條”的實(shí)現(xiàn),而另一個子類提供“吃滿漢全席”的實(shí)現(xiàn)泻拦。通過使用模板方法模式毙芜,一方面提高了代碼的復(fù)用性,另一方面還可以利用面向?qū)ο蟮亩鄳B(tài)性争拐,在運(yùn)行時選擇一種具體子類腋粥,實(shí)現(xiàn)完整的“請客”方法,提高系統(tǒng)的靈活性和可擴(kuò)展性架曹。
模板方法模式定義如下:
模板方法模式:定義一個操作中算法的框架隘冲,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟绑雄。
Template Method Pattern: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
模板方法模式是一種基于繼承的代碼復(fù)用技術(shù)展辞,它是一種類行為型模式。
模板方法模式是結(jié)構(gòu)最簡單的行為型設(shè)計模式万牺,在其結(jié)構(gòu)中只存在父類與子類之間的繼承關(guān)系罗珍。通過使用模板方法模式,可以將一些復(fù)雜流程的實(shí)現(xiàn)步驟封裝在一系列基本方法中脚粟,在抽象父類中提供一個稱之為模板方法的方法來定義這些基本方法的執(zhí)行次序覆旱,而通過其子類來覆蓋某些步驟,從而使得相同的算法框架可以有不同的執(zhí)行結(jié)果核无。模板方法模式提供了一個模板方法來定義算法框架扣唱,而某些具體步驟的實(shí)現(xiàn)可以在其子類中完成。

案例一

#_*_coding:utf-8_*_
 
class Register(object):
    '''用戶注冊接口'''
 
    def register(self):
        pass
    def login(self):
        pass
 
    def auth(self):
        self.register()
        self.login()
 
class RegisterByQQ(Register):
    '''qq注冊'''
 
    def register(self):
        print("---用qq注冊-----")
 
    def login(self):
        print('----用qq登錄-----')
 
 
 
class RegisterByWeiChat(Register):
    '''微信注冊'''
 
    def register(self):
        print("---用微信注冊-----")
 
    def login(self):
        print('----用微信登錄-----')
 
 
if __name__ == "__main__":
 
    register1 = RegisterByQQ()
    register1.login()
    register1.auth()
 
    register2 = RegisterByWeiChat()
    register2.login()
    register2.auth()

運(yùn)行結(jié)果

'''
----用qq登錄-----
---用qq注冊-----
----用qq登錄-----
----用微信登錄-----
---用微信注冊-----
----用微信登錄-----
'''

分析:以上是兩種驗證方式团南,在父類中只實(shí)現(xiàn)了統(tǒng)一的驗證方式噪沙,但是登錄和注冊是在子類中實(shí)現(xiàn)的,而子類實(shí)例可以調(diào)用父類的驗證方法已慢,這種在調(diào)用父類方法時調(diào)用子類方法的形式成為鉤子模式曲聂,也就是模板方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佑惠,一起剝皮案震驚了整個濱河市朋腋,隨后出現(xiàn)的幾起案子齐疙,更是在濱河造成了極大的恐慌,老刑警劉巖旭咽,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞奋,死亡現(xiàn)場離奇詭異,居然都是意外死亡穷绵,警方通過查閱死者的電腦和手機(jī)轿塔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仲墨,“玉大人勾缭,你說我怎么就攤上這事∧垦” “怎么了俩由?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長癌蚁。 經(jīng)常有香客問我幻梯,道長,這世上最難降的妖魔是什么努释? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任碘梢,我火速辦了婚禮,結(jié)果婚禮上伐蒂,老公的妹妹穿的比我還像新娘煞躬。我一直安慰自己,他們只是感情好饿自,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布汰翠。 她就那樣靜靜地躺著,像睡著了一般昭雌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上健田,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天烛卧,我揣著相機(jī)與錄音,去河邊找鬼妓局。 笑死总放,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的好爬。 我是一名探鬼主播局雄,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼存炮!你這毒婦竟也來了炬搭?” 一聲冷哼從身側(cè)響起蜈漓,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宫盔,沒想到半個月后融虽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灼芭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年有额,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彼绷。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡巍佑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寄悯,到底是詐尸還是另有隱情萤衰,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布热某,位于F島的核電站腻菇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏昔馋。R本人自食惡果不足惜筹吐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秘遏。 院中可真熱鬧丘薛,春花似錦、人聲如沸邦危。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倦蚪。三九已至希坚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陵且,已是汗流浹背裁僧。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慕购,地道東北人聊疲。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像沪悲,于是被迫代替她去往敵國和親获洲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

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