1. 程式人生 > >設計模式-9-模板

設計模式-9-模板

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;
/**
 * 抽象類規範子類框架結構
 */
public
abstract 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-模板