模板模式,定義了一個模板,模板內容經過子類實現模板的抽象方法去添加。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>
參考資料: