設計模式-模板方法模式(Template Method Pattern) 2.1 定義 定義一個操作中演算法的框架,將一些步驟延遲到子類中去操作,使得子類可以不改變結構就可以改變一些特定的步驟. 模板方法模式很簡單.就只是使用了一個繼承(extends),其中abstractClass 叫做抽象模板. ...
設計模式-模板方法模式(Template Method Pattern)
2.1 定義
定義一個操作中演算法的框架,將一些步驟延遲到子類中去操作,使得子類可以不改變結構就可以改變一些特定的步驟.
模板方法模式很簡單.就只是使用了一個繼承(extends),其中abstractClass 叫做抽象模板.
它的方法分為兩類:
- 基本方法
具體操作,在子類進行操作由父類進行調用
- 模板方法
由一個或多個方法組成,也就是框架,完成對基本方法的調度
public abstract class AbstractClass { //基本方法 protected void doSomething() { } //基本方法 protected void doAnything() { } //模板方法 public void templateMethod(){ doSomething(); doAnything(); } }
測試:
1 public class TestClass extends AbstractClass { 2 3 // 基本方法 4 protected void doSomething() { 5 System.out.println("基本方法實現 1"); 6 } 7 8 // 基本方法 9 protected void doAnything() { 10 System.out.println("基本方法實現 2"); 11 } 12 13 public static void main(String[] args) { 14 TestClass test = new TestClass(); 15 test.templateMethod(); 16 } 17 }
2.2 模板方式的應用
優點:
封裝不變部分,拓展可變部分;
提取公共代碼,易於維護
行為由父類控制,子類只負責實現
缺點:
最主要就是閱讀難度的問題 容易讓新手懵圈
使用場景:
多個子類有共有方法時,並且邏輯基本相同
重要,複雜的演算法,可以把核心演算法設計成模板方法,周邊相關細節由子類完成
重構時,模板方法肯定是使用最多的方法,把相同的方法抽取到父類,在使用”鉤子函數”約束其行為.
2.3 模板方法的擴展(鉤子方法)
比如我們希望可以約束父類中某些方法的執行就可以使用鉤子方法
1 public abstract class AbstractClass { 2 3 boolean flag = false; 4 //基本方法 5 protected void doSomething() { 6 7 } 8 //基本方法 9 protected void doAnything() { 10 11 } 12 //模板方法 13 public void templateMethod(){ 14 if (flag) { 15 doSomething(); 16 } 17 doAnything(); 18 } 19 20 //鉤子方法 21 protected void setFlag(boolean flag) { 22 this.flag = flag; 23 }
//實現
1 public class TestClass extends AbstractClass { 2 3 // 基本方法 4 protected void doSomething() { 5 System.out.println("基本方法實現 1"); 6 } 7 8 // 基本方法 9 protected void doAnything() { 10 System.out.println("基本方法實現 2"); 11 } 12 13 public static void main(String[] args) { 14 TestClass test = new TestClass(); 15 test.setFlag(true); 16 test.templateMethod(); 17 } 18 }
這樣就非常容易的 使用模板了.父類調用子類方法