设计模式-9-模板

Posted wanhua.wu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-9-模板相关的知识,希望对你有一定的参考价值。

简介:让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤

目的:

总结:接口规范整体框架结构, 抽象父类规范子类结构

 

组成:接口,抽象类,子类

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-模板的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——.vue文件的模板

vscode之快速生成vue模板

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

Eclipse 中的通用代码片段或模板