模板方法介紹
模板方法模式是一種行為設計模式,它在超類中定義一個算法的框架,允許子類在不修改結構的情況下重寫算法的特定步驟。
模板方法模式建議將算法分解為一系列步驟,然后將這些步驟改為方法,最后在“模板方法”中依次調用這些方法。
步驟可以是抽象的,也可以有一些默認的實現。為了能夠使用算法,客戶端需要自行提供子類並實現所有的抽象步驟(有時候還需要重寫步驟)。
模板方法將算法分解為步驟,並允許子類重寫這些步驟,而非重寫實際的模板方法。
分解步驟
1、抽取步驟必須由各個子類來實現;
2、可選步驟已有一些默認實現,但仍可在需要時進行重寫。
模板方法的結構
- 1、抽象類
聲明作為算法步驟的方法,以及依次調用它們的實際模板方法。
算法步驟可以被聲明為抽象類,默認提供一些實現。
- 2、具體類
實現抽象方法的類,重寫所有步驟,但不能重寫模板方法自身。
適合場景
-
1、當希望客戶端擴展某個特定算法步驟,而不是整個算法或其結構時。
-
2、當多個類的算法除了一些細微不同之處幾乎完全一樣時。
實現方式
1、分析目標算法,確定能否將其分解為多個步驟(從所有子類的角度出發,考慮哪些步驟能夠通用,那些步驟各不相同)。
2、創建抽象基類並聲明一個模板方法和代表算法步驟的一系列抽象方法(在模板方法中根據算法結構依次調用相應步驟)。
對於默認的實現,可以給部分步驟帶來好處。同時可以考慮在算法的關鍵之間添加鈎子。
3、為每個算法變體新建一個具體子類,它必須實現所有的抽象步驟,也可以重寫部分可選步驟。
優點
1、你可僅允許客戶端重寫一個大型算法中的特定部分,使得算法其他部分修改對其所造成的影響減小。
2、可將重復的代碼提取到一個超類中。
缺點
1、部分客戶端會受到算法框架的限制。
2、會導致違法里氏替換原則,通過子類抑制默認步驟。
3、模板方法中步驟越多,后期的維護成本會增大。
Demo
它在基類中定義了一個算法的框架,允許子類在不修改結構的情況下重寫算法的特定步驟。
通常使用此模板方法來向框架用戶提供通過繼承實現的、對標准功能進行擴展的簡單方式
提供的抽象類
實現抽象類的具體類
客戶端和Main方法業務邏輯
首先我們可以看到在提供的抽象方法中,有一個模板方法,此方法用於執行基類聲明的算法步驟。后面客戶端只需要調用此方法就可以完成交給不同子類的業務。
不同的子類,由於繼承相同的抽象類,首先必須實現抽象方法,其次可根據每個子類的業務需求各自來實現某些鈎子方法,此方法用於在子類中超長發揮,各自都可以對進行變更,彼此不受影響。最后想要實現的是,我調用同樣的方法代碼,后面聲明實現的兩個類會得到不同的顯示結果。
由於1號沒有重寫鈎子方法,2號重寫了。所以當在模板方法中調用One()時,1號沒有進行任何操作,執行的是抽象類中的空方法,而2號重寫了,則輸出了重寫的方法。
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創不易,給個關注。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。