重複 = 易錯 + 難改
既然用了繼承,並且肯定這個繼承有意義,就應該要成為子類的模板,所有重複的**都應該要上公升到父類去,而不是讓每個子類都去重複。
當要完成在某一細節層次一致的乙個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同時,通常考慮用模板方法模式來處理。
模板(template)方法模式:定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某終特定步驟。
abstractclass
:抽象類、抽象模板,定義並實現了乙個模版方法。這個模版方法一般是乙個具體方法,給出了乙個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也可能呼叫一些具體方法。
concreteclass
:實現父類所定義的乙個或多個抽象方法。每乙個abstractclass
都可以有任意多個concreteclass
之對應,而每乙個concreteclass
都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏輯的實現各不相同。
客戶端呼叫
任務:抄寫題目並作答
# 金庸**考題試卷
class
test*****
(abc)
:def
__init__
(self)
->
none
:pass
deftest_question_1
(self)
->
none
:print
("楊過得到,後來給郭靖,煉成倚大劍、屠龍刀的玄鐵可能是【】:"
,"a. 球磨鑄鐵;b. 馬口鐵;c. 高速合金鋼;d. 碳素纖維"
)print
("答案:"
, self._answer_1())
deftest_question_2
(self)
->
none
:print
("楊過、程英、陸無雙剷除了情花,造成【】:"
,"a. 使這種植物不再害人;b. 使一種珍稀物種滅絕;c. 破壞了那個生物圈的生態平衡;d. 造成該地區沙漠化"
)print
("答案:"
, self._answer_2())
deftest_question_3
(self)
->
none
:print
("藍鳳凰致使華山師徒、桃吞六仙嘔吐不止,如果你是大夫,會給他們開什麼藥【】:"
,"a.阿司匹林;b. 牛黃解毒片;c. 氟哌酸;d. 讓他們喝大量的生牛奶;e. 以上全不對"
)print
("答案:"
, self._answer_3())
@abstractmethod
def_answer_1
(self)
-> text:
pass
@abstractmethod
def_answer_2
(self)
-> text:
pass
@abstractmethod
def_answer_2
(self)
-> text:
pass
# 學生甲抄的試卷
class
test*****a
(test*****)
:def
_answer_1
(self)
:return
"b"def
_answer_2
(self)
:return
"c"def
_answer_3
(self)
:return
"a"# 學生乙抄的試卷
class
test*****b
(test*****)
:def
_answer_1
(self)
:return
"c"def
_answer_2
(self)
:return
"a"def
_answer_3
(self)
:return
"a"
# 客戶端**
if __name__ ==
"__main__"
:print
("學生甲抄的試卷"
) student_a = test*****a(
) student_a.test_question_1(
) student_a.test_question_2(
) student_a.test_question_3(
)print
("學生乙抄的試卷"
) student_b = test*****b(
) student_b.test_question_1(
) student_b.test_question_2(
) student_b.test_question_3(
)
學生甲抄的試卷
楊過得到,後來給郭靖,煉成倚大劍、屠龍刀的玄鐵可能是【】: a. 球磨鑄鐵;b. 馬口鐵;c. 高速合金鋼;d. 碳素纖維
答案: b
楊過、程英、陸無雙剷除了情花,造成【】: a. 使這種植物不再害人;b. 使一種珍稀物種滅絕;c. 破壞了那個生物圈的生態平衡;d. 造成該地區沙漠化
答案: c
藍鳳凰致使華山師徒、桃吞六仙嘔吐不止,如果你是大夫,會給他們開什麼藥【】: a.阿司匹林;b. 牛黃解毒片;c. 氟哌酸;d. 讓他們喝大量的生牛奶;e. 以上全不對
答案: a
學生乙抄的試卷
楊過得到,後來給郭靖,煉成倚大劍、屠龍刀的玄鐵可能是【】: a. 球磨鑄鐵;b. 馬口鐵;c. 高速合金鋼;d. 碳素纖維
答案: c
楊過、程英、陸無雙剷除了情花,造成【】: a. 使這種植物不再害人;b. 使一種珍稀物種滅絕;c. 破壞了那個生物圈的生態平衡;d. 造成該地區沙漠化
答案: a
藍鳳凰致使華山師徒、桃吞六仙嘔吐不止,如果你是大夫,會給他們開什麼藥【】: a.阿司匹林;b. 牛黃解毒片;c. 氟哌酸;d. 讓他們喝大量的生牛奶;e. 以上全不對
答案: a
模板方法模式提供了乙個**復用平台,把不變行為搬移到超類,並去除子類中的重複**。
當不變的和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重複出現。通過模板方法模式把這些行為搬移到單一的地方,這樣就幫助子類擺脫重複的不變行為的糾纏。
大話設計模式學習筆記(10) 模板方法模式
原始碼git位址 老師在黑板上寫了一套試卷,需要小明和小剛兩個人做試卷。請用盡可能簡潔的 模擬出這個場景。最簡單無腦的做法 public class templatemode class ming void answerquestion2 class gang void answerquestion...
大話設計模式 模板方法模式
一 模式介紹 模板方法模式特別適合於整體流程 演算法 固定,只有一小部分功能不同的場景 通過乙個抽象父類構造起整個骨架,而將不固定的部分以抽象方法的形式保留,交給子類去具體實現 二 採用模板方法模式實現街邊小吃 烤冷麵 假設烤冷麵製作流程是固定的 1.加熱麵餅,2.加調料 我們先來實現乙個製作骨架 ...
《大話設計模式》模板方法模式
模板方法模式,定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。dp 模板方法模式提供了乙個很好的 復用平台,通過把不變行為搬移到超類,去除子類中的重複 來體現它的優勢。有時候,我們會遇到由一系列步驟構成的過程需要執行...