设计模式之模板方法模式

1、简述

写简历的时候,咱们一般会找好一个模板,以后往模板上填充上我的信息、项目信息就构成了本身的简历。这种经过通用格式、通用模板来构建新对象的方式,在编程上就是“模板方法模式”编程

2、例子

假设这么个场景:咱们但愿出试卷的老师,可以出一套统一格式的试卷,无论是什么科目,都有选择题、判断题、简答题,那咱们就能够使用模版模式。bash

咱们先把模版类定义好markdown

package com.design.template;

public abstract class PaperTemplate {

    /**
     * 选择题
     */
    protected abstract void choiceQuestion();

    /**
     * 判断题
     */
    protected abstract void trueOrFalseQuestion();

    /**
     * 简答题
     */
    protected abstract void shortAnswerQuestion();

    /**
     * 获取整张试卷内容
     */
    public void getTestPaper(){
        choiceQuestion();
        trueOrFalseQuestion();
        shortAnswerQuestion();
    }

}复制代码

接下来就经过扩展这个模版来构建具体的试卷、好比数学试卷app

package com.design.template;

public class MathPaper extends PaperTemplate {
    @Override
    protected void choiceQuestion() {
        System.out.println("选择题:");
        System.out.println("一、不小于-4的非正整数有()\n" +
                "A、5个 " +
                "B、4个\n" +
                "C、3个 " +
                "D、2个");
        System.out.println("二、若是两个有理数在数轴上的对应点分别在原点的两侧,那么这两个数的商必定是()\n" +
                "A、正数 " +
                "B、负数\n" +
                "C、0 " +
                "D、多是正数或负数");

    }

    @Override
    protected void trueOrFalseQuestion() {
        System.out.println("判断题:");
        System.out.println("一、两个数的积是正数,那么这两个数的商也是正数 []");
        System.out.println("二、-a必定表示负数。 []");
    }

    @Override
    protected void shortAnswerQuestion() {
        System.out.println("简答题:");
        System.out.println("一、出租司机小张某天下午的营运全是在到西走向的大街上进行的,若规定向东为正,向西为负,他这天下午行车里程(单位:公里)记录以下: +8,-3,+15,-10,-13,+3,-15,+11,-12 (7分)\n" +
                "(1)将最后一名乘客送到目的地时,小张距下午出车点的距离是多少公里?\n" +
                "(2)若汽车耗油量为0.08升/公里,这天下午汽车共耗油多少升?");
    }
}复制代码

再经过这套模块生成一套化学题ide

package com.design.template;

public class ChemistryPaper extends PaperTemplate {
    @Override
    protected void choiceQuestion() {
        System.out.println("选择题:");
        System.out.println("一、只发生物理变化的是( )\n" +
                "A、矿石粉碎 " +
                "B、纸张燃烧\n" +
                "C、光合做用 " +
                "D、铁钉生锈");
        System.out.println("二、下列生活中常见的一些变化,其中属于化学变化的是 ( )\n" +
                "A、夏天雪糕慢慢融化 " +
                "B、潮湿的衣服在空气中变干\n" +
                "C、洗净的铁锅出现锈迹 " +
                "D、夏天从冰箱取出的瓶子外壁附着一层水珠");
    }

    @Override
    protected void trueOrFalseQuestion() {
        System.out.println("判断题:");
        System.out.println("一、果糖、葡萄糖、麦芽糖都是具备甜味的晶体。 []");
        System.out.println("二、淀粉、油脂、蛋白质和纤维素都属于高分子且一般是混合物。 []");
    }

    @Override
    protected void shortAnswerQuestion() {
        System.out.println("推断简答:");
        System.out.println("A、B、C、D、E五种元素中,A的原子中没有中子;B元素的单质能供给动植物呼吸;C是主要存在于人体骨骼和牙齿中的金属元素;D元素的单质在空气中含量最多;E是组成化合物种类最多的元素.请回答下列问题.\n" +
                "(1)A和D的元素符号依次是_____、 ______.\n" +
                "(2)由上述元素组成的两种非金属单质发生反应的化学方程式是 、 .\n" +
                "(3)由A、B、C三种元素组成的物质与盐酸反应的化学方程式 .\n" +
                "(4)由A、B、D、E四种元素组成一种盐的化学式 ,该盐的一种用途是 .");
    }
}复制代码

接下来就能够使用这些试卷了
spa

public class Main {

    public static void main(String[] args) {
        System.out.println("***********数学题***********");
        PaperTemplate mathPapper = new MathPaper();
        mathPapper.getTestPaper();

        System.out.println("***********化学题***********");
        PaperTemplate chemistryPaper = new ChemistryPaper();
        chemistryPaper.getTestPaper();
    }
}复制代码

执行结果3d


能够看到、经过定义模版,便可统一格式、让全部使用这个模版的试卷具备相同题目类型、相同格式、这就是模版模式。code

3、应用

模版模式在Java中有普遍的应用,如ArrayQueue、ArrayList都继承AbstractList、将通用的代码抽象在AbstractList这模版类中。同时经过抽象方法、指定了具体实现类须要实现的方法。orm

4、总结

一、模版方法模式能够经过模版抽象出一些公共的代码,如上面例子中getTestPaper()方法,这个方法是通用的获取试卷的方法,不须要每份试卷都单独去实现。二、同时模版又给具体实现规范了需实现的内容。如上,规定了每一个学科类型试卷都须要有选择、判断、简单题。对象

相关文章
相关标签/搜索