模板?生科的小朋友或許會這樣理解,DNA復制或轉錄時,用來產生互補鏈的核苷酸序列。在我們的日程生活中,我們也時常與模板打交道,比如有些師哥師姐畢業了,需要寫簡歷應聘,這個時候就有了簡歷模板;臨近畢業大四的孩子,需要準備論文,就有了論文模板,所以,模板的概念就是有一個規定的格式,然后每個人都可以根據自己的需求或情況去更新完善它,例如簡歷模板,從網上down下來的簡歷模板的格式都是相同的,要想拿到一份滿意的offer,我們首先要根據自己的情況填充不同的內容完成屬于自己的簡歷,拿到那夢寐以求的Offer。
在設計模式中,模板方法模式中模板和生活中模板概念非常類似。模板方法模式——在一個抽象類中定義一個操作中的算法骨架(對應于生活中的大家down的模板),而將一些步驟延遲到子類中去實現(對應于我們根據自己的情況向模板填充內容)。模板方法使得子類可以不改變一個算法的結構前提下,重新定義算法的某些特定步驟,模板方法模式把不變行為搬到超類中,從而去除了子類中的重復代碼。來看一下我們模板方法模式的結構圖:
? ? ? ? ?
除了簡歷模板之外,我們再來舉一個生活中的故事,而我就是這個故事中傻傻的主角兒,這幾天飯卡里沒有錢了,人是鐵飯是鋼,一頓不吃餓得慌,雖然說減肥刻不容緩,可是真理說的好啊,不吃飽哪兒來的力氣減肥啊,周二下午四點來到工商銀行ATM機錢取錢,奇怪,為什么密碼不對呢?無奈,再來一次,就這樣連續三次,我的銀行卡光榮的被鎖住了,拔出銀行卡一看,我看見了什么,上面赫然寫著,郵政儲蓄,原來我把郵政儲蓄的卡當成了工行的卡,兩個卡的密碼不一樣,我在工行取錢,插到ATM機的是郵政的卡,按的密碼是郵政銀行卡的密碼,所以,才發生了剛才那不堪回首的一幕,沒有辦法,去前臺把卡給解鎖了,這樣才能有力氣減肥。
來到服務廳,人真多啊,在銀行辦理業務時,一般我們都按照這樣的步驟依次進行,取號排隊,辦理具體業務,對銀行工作人員進行評分,這樣一套工作流程不就是我們的模板方法模式?我們先來看看這個例子的類圖:
? ? ? ? ? ? ?
有了類圖,我們的代碼需要如何實現呢:
? ? ? ? ? ? ?
~~~
//?客戶端調用??
????class?Client??
????{??
????????static?void?Main(string[]?args)??
????????{??
????????????//?創建一個辦業務流程實例并調用模板方法??
????????????Business?business?=?new??Business();??
????????????business.?Flow();??
????????????Console.Read();??
????????}??
????}??
??
????public?abstract?class?Business??
????{??
????????//?模板方法,不要把模版方法定義為Virtual或abstract方法,避免被子類重寫,防止更改流程的執行順序??
????????public??void?Flow()??
????????{??
????????????Console.WriteLine("辦理業務的一般流程");??
????????????this.LineUp();????????????//取號排隊??
????????????this.Manage();????????????//辦理具體業務??
????????????this.Graded();?????//對銀行工作人員進行評分??
??????????????
????????}??
??
????????//?第一步取號排隊??
????????public??void?LineUp()??
????????{??
????????????Console.WriteLine("取號排隊");??
????????}??
??
????????//?第二步辦理具體業務??
????????public??void?Manage()??
????????{??
????????????Console.WriteLine("辦理具體業務");??
????????}??
??
????????//?第三步對銀行工作人員進行評分??
????????public??void?Graded()??
????????{??
????????????Console.WriteLine("對銀行工作人員進行評分");??
????????}??
????}??
??
????//?顧客A??
????public?class??Business:?Flow??
????{??
?????????
????????public?override?void??Business()??
????????{??
????????????Console.WriteLine("顧客A辦理業務");??
????????}??
????}??
??
????//?顧客B??
????public?class??Business?:?Flow??
????{????????
????????public?override?void??Business()??
????????{??
????????????Console.WriteLine("顧客B辦理業務");??
????????}??
????}??
~~~
經過銀行姐姐的辛苦工作,我的卡終于解鎖了,以后做事情要小心一點,不能這么馬虎了,都這么大個人了,是吧,言歸正傳,模板方法模式--準備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然后聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。這就是模版方法模式的用意。設計之旅,未完待續.......