一、什么是模板方法模式
概念:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
通俗的講,模板方法模式是通過把不變行為搬到超類,去除子類里面的重復(fù)代碼提現(xiàn)它的優(yōu)勢,它提供了一個很好的代碼復(fù)用平臺。當(dāng)不可變和可變的方法在子類中混合在一起的時候,不變的方法就會在子類中多次出現(xiàn),這樣如果摸個方法需要修改則需要修改很多個,雖然這個這個問題在設(shè)計之初就應(yīng)該想好。這個時候模板方法模式就起到了作用了,通過模板方法模式把這些重復(fù)出現(xiàn)的方法搬到單一的地方,這樣就可以幫助子類擺脫重復(fù)不變的糾纏。
舉個好懂的例子,小時候筆者家里窮,在農(nóng)村上小學(xué)的時候考試都是每個學(xué)生手抄試卷,因為那個時候?qū)W校還沒有試卷印刷。全班五十多個學(xué)生每個學(xué)生都要重復(fù)抄一遍黑板的試卷,并且像筆者這樣的近視眼很容易就抄錯了,8抄成3,7抄成1等到,然后明明做對了但是分數(shù)就是不高,導(dǎo)致筆者一直是全班倒數(shù)。這就是個很嚴(yán)重的重復(fù)不可變的問題,現(xiàn)在條件好了不少,學(xué)生不需要抄試卷,試卷印刷就解決了這個重復(fù)抄試卷的問題。模板方法也是類似。
二、模式對比
1、抄試卷模式
筆者就以抄試卷模式為名來闡述重復(fù)不變帶來的不便,下面會對該模式進行改進。
學(xué)生甲抄的試卷
public class TestPaperA { //試卷第一題 public void testQuestion1(){ System.out.println("小龍女是楊過的什么親戚?() A.小姨媽 B.大姨媽 C.姑媽 D.舅媽"); System.out.println("答案:C"); } //試卷第二題 public void testQuestion2(){ System.out.println("全真教的首任掌門是誰?A.周伯通 B.歐陽鋒 C.王重陽 D.西門吹牛"); System.out.println("答案:C"); } //試卷第三題 public void testQuestion3(){ System.out.println("《天龍八部》中被封為南院大王的大俠是誰?A.段譽 B.喬峰 C.慕容復(fù) D.段智興"); System.out.println("答案:B"); } }