Define the skeleton of an algorithm in an operation ,define steps to subclass.Tenplate Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.java
定義一個操做中的算法的框架,而將一些步驟延遲到子類中。使得子類能夠不改變一個算法的結構便可從新定義該算法的某些特定步驟。算法
聽起來好高端的樣子,個人理解:設計模式
1.父類聲明瞭若干個抽象方法(基本方法)和若干個具體方法(模板方法)框架
2.抽象方法是一個算法(過程)的步驟,在子類中實現ide
3.模板方法是一個算法(過程)的框架,在父類中已經約定好,實現對基本方法調用,完成固定的邏輯this
4.一個算法(過程)的結構在父類中定義,具體的實現細節則在子類中實現spa
注:爲了防止惡意操做,通常模板方法都加上final,禁止重寫設計
抽象模板類code
package TemplateMethod; public abstract class AbstractClass { protected abstract void doSomething(); protected abstract void doAnything(); protected void templateMethod(){ this.doAnything(); this.doSomething(); } }
具體模板類繼承
package TemplateMethod; public class ConcreteClass1 extends AbstractClass{ @Override protected void doSomething() { System.out.println("ConcreteClass1執行算法的第二步..."); } @Override protected void doAnything() { System.out.println("ConcreteClass1執行算法的第一步..."); } } package TemplateMethod; public class ConcreteClass2 extends AbstractClass{ @Override protected void doSomething() { System.out.println("ConcreteClass2執行算法的第二步..."); } @Override protected void doAnything() { System.out.println("ConcreteClass2執行算法的第一步..."); } }
場景類
package TemplateMethod; public class Client { public static void main(String[] args) { AbstractClass class1 = new ConcreteClass1(); AbstractClass class2 = new ConcreteClass2(); class1.templateMethod(); class2.templateMethod(); } }
1. 封裝不變部分,擴展可變部分
2. 提取公共部分代碼,便於維護
3. 行爲由父類控制,子類實現
1. 多個子類有公共方法,而且邏輯基本相同
2. 對複雜的算法,核心算法設計爲模板方法,細節功能則由各個子類實現
3. 重構代碼
基本方法因爲不須要對外提供訪問,所以能夠設計爲protected類型
設計鉤子方法(Hook Method):對外部提供接口,能夠影響模板方法內的具體執行順序
父類創建框架,子類在重寫了父類部分方法後,再調用從父類繼承的方法,產生不一樣的結果。
參考內容:
《設計模式之禪》 秦小波著