一勾缭、模式定義
所謂模板方法模式就是在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中脉课。模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下救军,重新定義算法中的某些步驟。
模板方法模式是基于繼承的代碼復(fù)用技術(shù)的倘零。在模板方法模式中唱遭,我們可以將相同部分的代碼放在父類中,而將不同的代碼放入不同的子類中呈驶。也就是說我們需要聲明一個抽象的父類拷泽,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實現(xiàn),然后聲明一些抽象方法讓子類來實現(xiàn)剩余的邏輯袖瞻,不同的子類可以以不同的方式來實現(xiàn)這些邏輯司致。
其實所謂模板就是一個方法,這個方法將算法的實現(xiàn)定義成了一組步驟聋迎,其中任何步驟都是可以抽象的脂矫,交由子類來負(fù)責(zé)實現(xiàn)。這樣就可以保證算法的結(jié)構(gòu)保持不變砌庄,同時由子類提供部分實現(xiàn)羹唠。
模板是一個方法,那么他與普通的方法存在什么不同呢娄昆?模板方法是定義在抽象類中佩微,把基本操作方法組合在一起形成一個總算法或者一組步驟的方法。而普通的方法是實現(xiàn)各個步驟的方法萌焰,我們可以認(rèn)為普通方法是模板方法的一個組成部分哺眯。
二、模式UML結(jié)構(gòu)
從上面的結(jié)構(gòu)可以看出扒俯,模板方法模式就兩個角色:
AbstractClass:抽象類
ConcreteClass:?具體子類
其中抽象類提供一組算法和部分邏輯的實現(xiàn)奶卓,具體子類實現(xiàn)剩余邏輯。
三撼玄、模式的結(jié)構(gòu)
模版方法模式由一個抽象類和一個(或一組)實現(xiàn)類通過繼承結(jié)構(gòu)組成夺姑,抽象類中的方法分為三種:
(1)抽象方法:父類中只聲明但不加以實現(xiàn),而是定義好規(guī)范掌猛,然后由它的子類去實現(xiàn)盏浙。
(2)模版方法:由抽象類聲明并加以實現(xiàn)。一般來說荔茬,模版方法調(diào)用抽象方法來完成主要的邏輯功能废膘,并且,模版方法大多會定義為final類型慕蔚,指明主要的邏輯功能在子類中不能被重寫丐黄。
(3)鉤子方法:由抽象類聲明并加以實現(xiàn)。但是子類可以去擴(kuò)展孔飒,子類可以通過擴(kuò)展鉤子方法來影響模版方法的邏輯灌闺。
抽象類的任務(wù)是搭建邏輯的框架,通常由經(jīng)驗豐富的人員編寫十偶,因為抽象類的好壞直接決定了程序是否穩(wěn)定性菩鲜。
實現(xiàn)類用來實現(xiàn)細(xì)節(jié)。抽象類中的模版方法正是通過實現(xiàn)類擴(kuò)展的方法來完成業(yè)務(wù)邏輯惦积。只要實現(xiàn)類中的擴(kuò)展方法通過了單元測試接校,在模版方法正確的前提下,整體功能一般不會出現(xiàn)大的錯誤狮崩。
四蛛勉、模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
1、模板方法模式在定義了一組算法睦柴,將具體的實現(xiàn)交由子類負(fù)責(zé)诽凌。
2、模板方法模式是一種代碼復(fù)用的基本技術(shù)坦敌。
3侣诵、模板方法模式導(dǎo)致一種反向的控制結(jié)構(gòu)痢法,通過一個父類調(diào)用其子類的操作,通過對子類的擴(kuò)展增加新的行為杜顺,符合“開閉原則”财搁。
缺點(diǎn)
每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),導(dǎo)致類的個數(shù)增加躬络,是的系統(tǒng)更加龐大尖奔。
五、使用場景
1穷当、一次性實現(xiàn)一個算法的不變的部分提茁,并將可變的行為留給子類來實現(xiàn)。
2馁菜、各子類中公共的行為應(yīng)被提取出來并集中到一個公共父類中以避免代碼重復(fù)茴扁。
3、控制子類的擴(kuò)展汪疮。
六丹弱、模式總結(jié)
1、模板方法模式定義了算法的步驟铲咨,將這些步驟的實現(xiàn)延遲到了子類躲胳。
2、模板方法模式為我們提供了一種代碼復(fù)用的重要技巧纤勒。
3坯苹、模板方法模式的抽象類可以定義抽象方法、具體方法和鉤子摇天。
4粹湃、為了防止子類改變算法的實現(xiàn)步驟,我們可以將模板方法聲明為final泉坐。
七为鳄、參考文章