设计模式-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>
时间: 2024-10-19 19:21:45

设计模式-9-模板的相关文章

【设计模式】模板模式

引子 这是一个很简单的模式,却被非常广泛的使用. 之所以简单是因为在这个模式中仅仅使用到了继承关系. 继承关系由于自身的缺陷,被专家们扣上了“罪恶”的帽子. “使用委派关系代替继承关系”, “尽量使用接口实现而不是抽象类继承”等等专家警告,让我们大家对继承“另眼相看”. 其实,继承还是有很多自身的优点所在.只是被大家滥用的似乎缺点更加明显了. 合理的利用继承关系,还是能对你的系统设计起到很好的作用的. 而模板方法模式就是其中的一个使用范例. 定义与结构 模板方法(Template Method)

设计模式之模板模式

模板模式是一个非常简单的行为类模式. 模板方法Gof的定义是:在一个方法里定义算法的骨架,将一些步骤延迟到其子类. 模板模式包含一个抽象的类和它的实现类,我们在抽象类中定义骨架,需要用到的方法都是抽象方法,具体的实现由它的子类来完成. eg: public abstract class Template{ public void printDate(){ // 显示排序后的List sort(list); } public List sort(List list); } public class

C++设计模式实现--模板(Template)模式

一. 问题 在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的.Template提供了这种情况的一个实现框架. 二. 模式 Template 模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节. 三. 代码 [cpp] view plaincopy //抽象基类,实现了一个模板方法 class AbstractClass { pu

设计模式之 - 模板模式(Template Pattern)

引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(ClassPathXmlApplicationContext),以及根据项目上下文目录(XmlWebApplicationContext)加载配置文件.这个在加载的过程中就使用了模板设计模式,所以就来学习下模板设计模式. 1. 模板设计模式在书中定义:  定义一个

设计模式之----模板模式

模板方法设计模式 该设计模式解决的问题是:具有固定算法(步骤)的应用.但这些算法步骤,又针对不同的用户(情况)具有不同的实现方式. 在该设计模式中,具有两大类方法:模板方法,步骤方法. 步骤方法又根据其实现情况,分为三种:抽象方法.最终方法.钩子方法. 抽象方法:要求子类必须要实现的方法. 最终方法:由final修饰的方法,不能被子类重写的方法. 钩子方法:具有默认的实现,但可以被子类重写的方法.一: 设计模板类 1 public abstract class DinnerSever { 2 /

&lt;七&gt;读&lt;&lt;大话设计模式&gt;&gt;之模板模型

哈哈,真没想到,不知不觉已经写到第七篇文章了,看来本人还是很有毅力的.其实坚持一件事很简单,只要你每天不断的朝着自己的目标出发,任何事情都不会挡着你.好了大道理不多说,谁都懂,那看看这个模板模式大家懂不懂了. 对于模板模式可能听起来很吓人,其实大家都用过,只是不知道罢了,也很简单.从字面意思上看就是我写出一个模板,然后其他类直接继承它就可以拥有模板类中的东西了,听起来像继承的定义,是的,就像现在开发一个论坛,为了能够开发速度更快,我们通常就是网上找一个模板下载下来,然后在模板基础上进行二次开发,

设计模式之模板模式 template

设计模式 模板模式如果有一个流程如下step1();step2();step3();step4();step5();其中step3() step5()是需要用户自己编写使用其他步骤是固定的那么可以写成 // 11111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <memory> using namespace std; class Lib { public:

JAVA设计模式之模板模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 模板方法模式的结构 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作

设计模式-15 模板模式

一 模板模式 定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.也就是说:假如某些操作代码基本相同,只是其中一部分会经常改变,则可以使用模板方法,将不变的部分作为一个模板,将容易变动的部分让子类来实现. 关键代码:在抽象类实现,其他步骤在子类实现. 使用场景: Spirng 中对 Jdbc的支持 类图 : 二 实现代码 1 例子1 1) 回调接口 ICallBack.java public interface ICallB

入门设计模式之模板

学习更多设计模式请参考:入门设计模式之汇总篇 模板方法:在一个抽象类中定义一部分的实现,其余的定义抽象方法迫使子类实现 相信看了上方的定义以后大家已经理解了模板模式,我们来看一下类图 抽象类定义了4个方法,其中operation是私有的,在这个方法里调用了其他三个方法,而方法3是自己实现的.方法1和2是强迫子类实现的. ClassImpl1,ClassImpl2都继承了抽象类,并分别对方法1和2进行了不同的实现 我们来看代码 public abstract class AbstractClass