# 前言 這次是本系列的第10篇 主題是範本方法模式(Template Method Pattern) # 範本方法模式 範本方法模式(Template Method Pattern) 一種行為型設計模式,它定義了一個操作中的演算法框架,並且允許子類去改變特定步驟的實現,而不改變該演算法的結構。 這種模式的主要目的是固定流程,但允許部分步驟的實現細節可以在子類中改變,以實現靈活的擴展和代碼復用。 範本方法模式的核心思想 範本方法模式涉及一個包含範本方法的基類,這個範本方法通常會定義一個操作的步驟順序,並且調用一些抽象方法或鉤子方法 這些抽象方法或鉤子方法由子類來實現。這樣就可以在不改變整體流程的情況下,自由地改變某些步驟的行為。 範本方法模式的結構 1. 抽象類(Abstract Class): 定義演算法的骨架,包含範本方法和若干抽象方法或鉤子方法。 範本方法是具體方法,定義了一個操作的整體流程,抽象方法則留給子類具體實現。 2. 具體類(Concrete Class) 繼承自抽象類,實現抽象類中的抽象方法或鉤子方法,從而為範本方法中的特定步驟提供具體的實現。 這次的情境是你發現出門上班,跟出門買東西 所要做的準備都差不多,只是差在出門的目的不一樣 於是程式可以這樣寫 ```python= from abc import ABC, abstractmethod class GoOut(ABC): def check_weather(self): # hooks pass @abstractmethod def change_clothes(self): pass def take_the_keys(self): print("拿鑰匙") def lock_the_door(self): print("鎖門") @abstractmethod def what_to_do(self): pass def ready_to_go(self): self.check_weather() self.change_clothes() self.take_the_keys() self.lock_the_door() self.what_to_do() class Work(GoOut): def change_clothes(self): print("換上班用的服裝") def what_to_do(self): print("出門上班 :(") class Shopping(GoOut): def change_clothes(self): print("換自己喜歡的服裝") def what_to_do(self): print("出門買東西 :)") def check_weather(self): print("檢查天氣狀況,決定是否出門買東西") if __name__ == '__main__': print("該出門上班了") work = Work() work.ready_to_go() print("-"*30) print("沒事幹,我想出門買東西") shopping = Shopping() shopping.ready_to_go() ``` 輸出則會長這樣 ``` 該出門上班了 換上班用的服裝 拿鑰匙 鎖門 出門上班 :( ------------------------------ 沒事幹,我想出門買東西 檢查天氣狀況,決定是否出門買東西 換自己喜歡的服裝 拿鑰匙 鎖門 出門買東西 :) ``` # 心得 這次的設計模式實作也不難 在工作中我也曾實做過類似的東西 但當時的我並不知道這是設計模式之一 也許有人會想問,為什麼`check_weather()`不在`Work()`類別中實作? 他看起來是個hooks? 這是因為大多數的工作不管天氣好壞都要上班:( 當然颱風假就另外一回事了
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up