設計模式-9-模板
阿新 • • 發佈:2017-07-22
stat ext 一個 tor ring xmlns 整體 頁面 res
簡介:讓子類別在不改變算法架構的情況下,重新定義算法中的某些步驟
目的:
總結:接口規範整體框架結構, 抽象父類規範子類結構
組成:接口,抽象類,子類
1,接口
package com.design.i.template; /** * 接口規範框架結構 */ public interface PageService { /** * HTML創建 * @return */ String createHtml(); }
2,抽象類
package com.design.i.template; /** * 抽象類規範子類框架結構 */ publicabstract class AbstractPage implements PageService{ private static final String DOC_TYPE = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"; private static final String W3_HTML = "<html xmlns=\"http://www.w3.org/1999/xhtml\">";private static final String END_HTML = "</html>"; private StringBuffer stringBuffer = new StringBuffer(); /** * 定義一個頁面的機構 * * 使用final不允許子類進行重寫次方法 */ @Override public final String createHtml() { stringBuffer.append(DOC_TYPE); stringBuffer.append("\n"); stringBuffer.append(W3_HTML); stringBuffer.append("\n"); /** * Head和Body有具體的子類實現 */ appendMeta(stringBuffer); stringBuffer.append("\n"); appendHead(stringBuffer); stringBuffer.append("\n"); appendBody(stringBuffer); stringBuffer.append("\n"); stringBuffer.append(END_HTML); return stringBuffer.toString(); } /** * 開放給子類的方法,子類根據自己需求進行重寫 * @param stringBuffer */ protected void appendMeta(StringBuffer stringBuffer){ stringBuffer.append("<meta -------------AbstractPage 默認 Meta 配置--------------- />"); } /** * 子類必須實現的方法 * @param stringBuffer * @return */ protected abstract void appendHead(StringBuffer stringBuffer); protected abstract void appendBody(StringBuffer stringBuffer); }
3,子類
package com.design.i.template; /** * 首頁 */ public class IndexPageServiceImpl extends AbstractPage{ @Override protected void appendMeta(StringBuffer stringBuffer) { stringBuffer.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"); } @Override protected void appendHead(StringBuffer stringBuffer) { stringBuffer.append("<head><title>首頁</title></head>"); } @Override protected void appendBody(StringBuffer stringBuffer) { stringBuffer.append("<body><h1>天貓商城雙十一交易額突破1200億 !</h1></body>"); } }
package com.design.i.template; /** * 詳情頁 */ public class DetailPageServiceImpl extends AbstractPage { @Override protected void appendHead(StringBuffer stringBuffer) { stringBuffer.append("<head><title>詳情頁</title></head>"); } @Override protected void appendBody(StringBuffer stringBuffer) { stringBuffer.append("<body><h1>聯想筆記本電腦 雙十一 打折價 1500 元 !</h1></body>"); } }
4,Main
package com.design.i.template; /** * 9-模板模式 * * 組成:一個接口,一個抽象類 * 原理:接口規範整體框架結構, 抽象父類規範子類結構, 抽象父類適當開放部分變化的功能, 子類根據自己需求實現功能 * 接口和抽象類定義框架,子類進行細節實現 * 用處:算法框架 * * JDK類加載器: * 1-啟動類加載器 * 加載JAVA_HOME/lib目錄下啟動類 * 2-擴展類加載器 * 加載JAVA_HOME/lib/ext目錄下擴展類 * 3-應用程序類加載器 * 加載用戶應用程序的類,例如:com.design.strategy.annotation.PriceFactory.classLoader */ public class MainTest { public static void main(String[] args){ //首頁 PageService indexPage = new IndexPageServiceImpl(); System.out.println(indexPage.createHtml()); //詳情頁 PageService detailPage = new DetailPageServiceImpl(); System.out.println(detailPage.createHtml()); } }
5,Result
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <head><title>首頁</title></head> <body><h1>天貓商城雙十一交易額突破1200億 !</h1></body> </html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <meta -------------AbstractPage 默認 Meta 配置--------------- /> <head><title>詳情頁</title></head> <body><h1>聯想筆記本電腦 雙十一 打折價 1500 元 !</h1></body> </html>
設計模式-9-模板