zoukankan      html  css  js  c++  java
  • 1.20(设计模式)模板模式

    模板模式,定义了一个模板,模板内容通过子类实现模板的抽象方法去添加。

    就类似学校需要建一个新校区,新校区有多栋宿舍,找了多个施工方,每个施工方负责一栋宿舍楼。

    各个施工方都有自己的想法,建造的宿舍楼各不相同,当然从使用上来说是可以的(毕竟可以用就行),只是后期装修维护不方便。

    现在为了后期便于管理维护,学习先找设计院设计图纸,所有的施工方都按照图纸上面的来建造,图纸大体的框架是相同的,

    但楼栋的某些具体细节各不相同,各个施工方根据自身情况调节。

    可以看做是施工方根据图纸模板建造,但某些具体细节仍然由施工方来确定。

    这样在定义和实现之间添加一个模板,使实现不那么随心所欲,而是在固定框架中去完善。

    例如html文档,文档头部和尾部的格式基本是固定的,只是body部分的内容不同。

    我们就可以构建一个包含html文档头部和尾部的模板,body部分根据具体需求填充内容即可。

    首先我们是要绘制html页面,所以先定义一个接口,里面有一个构建页面的方法。

    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>
    <html>
    " +
                    "<head>
    " + 
                    "<meta charset="UTF-8">
    " + 
                    "<title>Insert title here</title>
    " + 
                    "</head>
    " + 
                    "<body>");//html头部
            appendBody(stringBuffer);//子类实现该方法,填充具体内容
            stringBuffer.append("</body>
    </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

  • 相关阅读:
    二十三、Android源代码是这样搞到的(图解)
    defer用途
    vscode中go插件配置
    peewee外键性能问题
    bootstrap-select属性
    go环境变量及build文件
    peewee在flask中的配置
    python元类
    Java静态方法、单例模式区别
    Java实现list清除重复的字符串
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/11064098.html
Copyright © 2011-2022 走看看