來源:《設計模式之禪》java
定義:算法
定義一個操做中的算法框架,將一些步驟延遲到子類中,使得子類能夠不改變一個算法的結構便可從新定義該算法的某些步驟。設計模式
抽象模板方法能夠分爲兩類:框架
基本方法:由子類定義,在模板方法中調用。ide
模板方法:定義算法的步驟。通常模板方法添加final關鍵字,不容許被複寫。函數
類圖:this
代碼:設計
抽象模板:code
/** * */ package cc.pattern.template; /** * @author rico * 抽象模板類 */ public abstract class AbstractClass { /** * 基本方法 */ protected abstract void doAction1(); /** * 基本方法 */ protected abstract void doAction2(); /** * 模板方法,調用基本方法 */ final public void templateAction() { this.doAction1(); this.doAction2(); } }
具體模板1:
io
/** * */ package cc.pattern.template; /** * @author rico * 具體模板1 */ public class ConcreteClass extends AbstractClass { /* (non-Javadoc) * @see cc.pattern.template.AbstractClass#doAction1() */ @Override protected void doAction1() { System.out.println("###doAction1"); } /* (non-Javadoc) * @see cc.pattern.template.AbstractClass#doAction2() */ @Override protected void doAction2() { System.out.println("###doAction2"); } }
具體模板2:
/** * */ package cc.pattern.template; /** * @author rico * 具體模板2 */ public class ConcreteClass2 extends AbstractClass { /* (non-Javadoc) * @see cc.pattern.template.AbstractClass#doAction1() */ @Override protected void doAction1() { System.out.println("###doAction1"); } /* (non-Javadoc) * @see cc.pattern.template.AbstractClass#doAction2() */ @Override protected void doAction2() { System.out.println("###doAction2"); } }
場景:
/** * */ package cc.pattern.template; /** * @author rico * */ public class Client { /** * @param args */ public static void main(String[] args) { AbstractClass clazz1 = new ConcreteClass(); AbstractClass clazz2 = new ConcreteClass2(); System.out.println("###Clazz1"); clazz1.templateAction(); System.out.println("###Clazz2"); clazz2.templateAction(); } }
模板方法模式優勢:
封裝不變部分,擴張可變部分。
提取公共代碼部分,便於維護。
行爲由父類控制,之類實現。
模板方法模式缺點:
子類的執行結果影響父類,帶來代碼閱讀難度。
使用場景:
多個子類公有方法,而且邏輯基本相同。
重要/複雜的核心算法抽象爲模板方法,各個子類實現相關的細節。
用於重構,把相同的方法抽取到父類中,經過鉤子函數約束行爲。
擴展: