写简历的时候,咱们一般会找好一个模板,以后往模板上填充上我的信息、项目信息就构成了本身的简历。这种经过通用格式、通用模板来构建新对象的方式,在编程上就是“模板方法模式”。编程
假设这么个场景:咱们但愿出试卷的老师,可以出一套统一格式的试卷,无论是什么科目,都有选择题、判断题、简答题,那咱们就能够使用模版模式。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
模版模式在Java中有普遍的应用,如ArrayQueue、ArrayList都继承AbstractList、将通用的代码抽象在AbstractList这模版类中。同时经过抽象方法、指定了具体实现类须要实现的方法。orm
一、模版方法模式能够经过模版抽象出一些公共的代码,如上面例子中getTestPaper()方法,这个方法是通用的获取试卷的方法,不须要每份试卷都单独去实现。二、同时模版又给具体实现规范了需实现的内容。如上,规定了每一个学科类型试卷都须要有选择、判断、简单题。对象