1.20(設計模式)模板模式

模板模式,定義了一個模板,模板內容經過子類實現模板的抽象方法去添加。html

 

就相似學校須要建一個新校區,新校區有多棟宿舍,找了多個施工方,每一個施工方負責一棟宿舍樓。app

各個施工方都有本身的想法,建造的宿舍樓各不相同,固然從使用上來講是能夠的(畢竟能夠用就行),只是後期裝修維護不方便。框架

如今爲了後期便於管理維護,學習先找設計院設計圖紙,全部的施工方都按照圖紙上面的來建造,圖紙大致的框架是相同的,ide

但樓棟的某些具體細節各不相同,各個施工方根據自身狀況調節。學習

能夠看作是施工方根據圖紙模板建造,但某些具體細節仍然由施工方來肯定。測試

 

這樣在定義和實現之間添加一個模板,使實現不那麼爲所欲爲,而是在固定框架中去完善。ui

 

 

例如html文檔,文檔頭部和尾部的格式基本是固定的,只是body部分的內容不一樣。spa

咱們就能夠構建一個包含html文檔頭部和尾部的模板,body部分根據具體需求填充內容便可。設計

 

首先咱們是要繪製html頁面,因此先定義一個接口,裏面有一個構建頁面的方法。code

public interface PageUtil {
    public String buildPage();
}

 

 

html模板類,這就是在定義和實現之間的模板,加了這一層後使實現更規範,這就至關於施工圖紙。

子類始終是按照該類的HTML模板去構建頁面,只是body部分的內容不一樣,

body部分經過實現了 abstract void appendBody方法的子類重寫該方法肯定body部份內容。

public abstract class AbstractPageUtil implements PageUtil{
    private StringBuffer stringBuffer = new StringBuffer();
    
    @Override//固定格式的模板,子類始終是按照這個模板來構建HTML頁面的 public String buildPage() {
        stringBuffer.append("<!Doctype html>\r\n<html>\r\n" +
                "<head>\r\n" + 
                "<meta charset=\"UTF-8\">\r\n" + 
                "<title>Insert title here</title>\r\n" + 
                "</head>\r\n" + 
                "<body>");//html頭部
        appendBody(stringBuffer);//子類實現該方法,填充具體內容
        stringBuffer.append("</body>\r\n</html>");//html尾部 return stringBuffer.toString();
    }
    
    //子類填充body, abstract void appendBody(StringBuffer stringBuffer) ;
}

子類繼承模板類,實現appendBody方法便可,模板類的子類都是按照這個模式生成html文檔。

只是body的內容根據實際需求有所不一樣,

 

 

接下來就是繼承AbstractPageUtil 的子類,實現父類的appendBody方法,填充不一樣的內容。

public class HtmlPageUtil extends AbstractPageUtil{
    
    
    @Override
    void appendBody(StringBuffer stringBuffer) {//實現父類的方法,設置body部份內容,模板依然是父類的模板
        stringBuffer.append("hello world!");
    }
    
    public static void main(String[] args) {//測試
        HtmlPageUtil htmlPageUtil = new HtmlPageUtil();
        System.out.println(htmlPageUtil.buildPage());
    }
    
}
運行結果:
<!Doctype html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body>hello world!</body> </html>

 

 

參考資料:

https://www.cnblogs.com/zuoxiaolong/p/pattern10.html

https://www.runoob.com/design-pattern/template-pattern.html

相關文章
相關標籤/搜索