Template Method模板方法設計模式定義一個操做中算法的骨架,將具體步驟的執行延遲到子類中實現。Java中的抽象類就是使用了模板方法設計模式。模板方法設計模式結構以下: java
以文檔處理爲例,Template Method設計模式簡單例子以下: 算法
abstract class DocumentUtil{ public void openDocument(String name){ //判斷是否可以打開文檔也是模版方法 if(!canOpenDocument(name)){ return; } //工廠方法 Document doc = createDocument(); if(doc != null){ docs.addDocument(doc); //模版方法 aboutToOpenDocument(doc); doc.open(); doc.read(); } } //工廠方法 public abstract Document createDocument(); //模版方法 public abstract boolean canOpenDocument(name); public abstract void aboutToOpenDocument(); } public class MyDocumentUtil extends DocumentUtil{ //實現工廠方法 public Document createDocument(){ return new Document(); } //實現模板方法 public boolean canOpenDocument(name){ if(name != null && !name.equals(「」)){ return true; } return false; } public void aboutToOpenDocument(){ System.out.println(「This is about to open document.」); } }
不少學習設計模式的人看到上面的例子後,以爲Template Method模板方法設計模式很是相似Façade門面設計模式,Template Method模板方法設計模式和Façade門面設計模式的區別以下: 設計模式
(1).Template Method模板方法設計模式能夠先將一些流程和框架規定好,將這些流程和框架做爲程序除了的模版。具體的細節除了留給子類去實現。 app
(2).Façade門面設計模式僅僅只定義對外操做接口,具體的實現所有交給子類。 框架
策略模式使用組合,模板方法模式使用繼承。工廠方法模式是模板模式的一種變體。 學習
模板方法使得子類能夠在不改變算法結構的狀況下,重啓定義算法中的某些步驟,模板方法有如下3種變體: spa
JDK中模板方法模式應用: 設計
java.util.Collections#sort() code
Java swing/applet#paint() 繼承
Java applet/servlet#init(), destory()
XML SAX#startDocument(), startElement(),endElement, endDocument()