模板方法模式是乙個比較容易理解的設計模式,用乙個考試的例子來講比較通俗易懂,我們考試的時候大家用的都是同乙份試卷,只是是每個人做的答案有可能不一樣,如果每個人都抄乙份試卷那就要完蛋了,考試時間都放在抄試卷上了,如果老師把試卷寫在黑板上,那麼每個同學就只需要將答案交給老師就好了,從而節約了不少時間。
首先來看《大話設計模式》中用c#寫的例子,首先定義了試卷的題目和選項。
然後學生做的答案,但是學生寫了很多重複的東西,比如base.testquestion1/2/3
,等於每次答題都要抄題目,而且還要寫上「答案」關鍵字,那個痛苦作為過來人相信大家都懂,按照我們的過來人的經驗,當然是直接寫個abcd比較省事啦,把更多的時間放在思考上才能充分利用考試時間。
通過改進,用虛方法來實現答案方法,這樣每個學生只需要重寫answer
方法就可以了。
改進後學生只需要交填有abcd的答題卡就好了,也就是實現虛方法中的內容就好了。
用python實現就更簡單了,將上面的過程進行精簡得到下面的**,template_method
是父類要做的事,相當於老師出題,primitive_operation1/2
是子類要實現的事,相當於學生答題。
from abc import abstractmethod, abc
'''建立模板類,將需要子類實現的方法進行抽象'''
class
abstractclass
(abc)
: @abstractmethod
defprimitive_operation1
(self)
:#抽象方法1
pass
@abstractmethod
defprimitive_operation2
(self)
:#抽象方法2
pass
deftemplate_method
(self)
: self.primitive_operation1(
) self.primitive_operation2(
)'''與concreteclassb不同的方法實現'''
class
concreteclassa
(abstractclass)
:def
primitive_operation1
(self)
:#實現抽象方法1
print
('具體類a方法1實現'
)def
primitive_operation2
(self)
:#實現抽象方法2
print
('具體類a方法2實現'
)'''與concreteclassa不同的方法實現'''
class
concreteclassb
(abstractclass)
:def
primitive_operation1
(self)
:#實現抽象方法1
print
('具體類b方法1實現'
)def
primitive_operation2
(self)
:#實現抽象方法2
print
('具體類b方法2實現'
)if __name__ ==
'__main__'
: a = concreteclassa(
) b = concreteclassb(
) a.template_method(
) b.template_method(
)
JavaScript設計模式九(模板方法模式)
定義 模板方法模式是一種只需要使用繼承就可以實現的非常簡單的模式 模板方法模式由兩部分組成,第一部分是抽象父類,另一部分是具體的實現子類。通常抽象父類中封裝了子類的演算法框架,包括實現一些公共的方法以及封裝子類中所有方法的執行順序。子類通過繼承這個類,然後繼承了這個演算法,然後重寫父類的方法 例子是...
模板設計模式 設計模式 模板方法模式
在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。首先需要一定抽象的定義,沒有具體的實現,但是在抽象類的行為中,子類去程序這個抽象類,重寫抽象方法,實現不...
初識設計模式 chapter 08 模板方法模式
直到目前,我們的議題都繞著封裝轉,我們已經封裝了物件建立 方法呼叫 複雜介面 鴨子 披薩。接下來呢?我們將要深入封裝演算法塊,好讓子類可以在任何時候都可以將自己掛接進運算裡。我們甚至會在本章學到乙個受到好萊塢影響而啟發的設計原則。有些人沒有咖啡就活不下去,有些人則離不開茶。兩者的共同成分是什麼,當然...