一. 定義:java
模版方法模式:定義一個操做中的算法的框架,而將一些步驟延遲道子類中。使得子類可疑不改變一個算法的結構便可重定義該算法的某些特定步驟。算法
模版方法模式使用了java的繼承機制。框架
abstractClass(抽象模版):ide
它的方法分爲兩類:(1)基本方法(基本操做):由子類實現的方法,而且在模版方法被調用;函數
(2)模版方法:能夠有一個或幾個,通常是一個具體的方法,也就是一個框架,實現對基本方法的調度,完成固定的邏輯。(爲了防止惡意操做,通常模版方法都加上inal關鍵字,不容許被覆寫)。this
concreteClass(具體模版):實現父類所定義的一個或多個抽象方法,也就是父類定義的基本方法在子類中得以實現。spa
/** * 抽象模板類 **/ public abstract class AbstractClass { /** * 基本方法 */ protected abstract void doSomething(); /** * 基本方法 */ protected abstract void doAnything(); /** * 模板方法 */ public void templateMethod() { // 調用基本方法,完成相關邏輯 this.doAnything(); this.doSomething(); } }
/** * 具體模板類 */ public class ConcreteClass1 extends AbstractClass { /** * 實現基本方法 */ @Override protected void doSomething() { // 業務邏輯處理 } /** * */ @Override protected void doAnything() { // 業務邏輯處理 } }
/** * 具體模板類 */ public class ConcreteClass2 extends AbstractClass { /** * 實現基本方法 */ @Override protected void doSomething() { // 業務邏輯處理 } /** * */ @Override protected void doAnything() { // 業務邏輯處理 } }
public class Client { public static void main(String[] args) { AbstractClass class1 = new ConcreteClass1(); AbstractClass class2 = new ConcreteClass2(); // 調用模板方法 class1.templateMethod(); class2.templateMethod(); } }
二. 模版方法模式優缺點:設計
模版方法模式優勢:繼承
-- 封裝不變部分,擴展可變部分;it
-- 提取公共部分代碼,便於維護;
-- 行爲由父類控制,子類實現。
模版方法模式缺點:
-- 按照設計習慣,抽象類負責聲明最抽象、最通常的事物屬性和方法,實現類完成具體的事物屬性和方法。可是模板模式卻顛倒了,抽象類定義了部分抽象方法,由子類實現,子類執行結果影響了父類的結果,也就是子類對父類產生了影響,在複雜項目中會帶來代碼閱讀難度。
三. 模版方法模式的使用場景及注意事項
1.使用場景:
-- 多個子類有公有的方法,而且邏輯基本相同;
-- 重要、複雜的算法,能夠把核心算法設計爲模板方法,周邊的相關細節功能則由各個子類實現;
-- 重構時,模板方法模式是一個常用的模式,把相同的代碼抽取到父類中,而後經過鉤子函數約束其行爲。