設計模式15——Template Method設計模式

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

模板方法模式中必須子類實現的方法定義爲抽象方法。
子類可選的方法能夠在父類中提供默認版本即鉤子(hook)。
不但願子類重寫的方法定義爲final。

JDK中模板方法模式應用: 設計

java.util.Collections#sort() code

Java swing/applet#paint() 繼承

Java applet/servlet#init(), destory()

XML SAX#startDocument(), startElement(),endElement, endDocument()

相關文章
相關標籤/搜索