• 设计模式-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("
    ");
            stringBuffer.append(W3_HTML);
            stringBuffer.append("
    ");
            
            /**
             * Head和Body有具体的子类实现
             */
            appendMeta(stringBuffer);
            stringBuffer.append("
    ");
            appendHead(stringBuffer);
            stringBuffer.append("
    ");
            appendBody(stringBuffer);
            stringBuffer.append("
    ");
            
            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>
  • 相关阅读:
    hadoop机架感知
    Ajax请求结果的缓存
    Blocks语法
    CentOS yum 源的配置与使用
    .NET三层架构开发初步
    Mac技巧合集第一期
    Fine Uploader文件上传组件
    WCF 系列文章
    http权威指南读书笔记
    WCF Service Hosting的线程关联性Mono实现比.NET统一?
  • 原文地址:https://www.cnblogs.com/wanhua-wu/p/7221491.html
Copyright © 2020-2023  润新知