概念

定义一个操作中的算法骨架,而将一些步骤延伸到子类中。模板方法使得子类可以不改变一个算法结构即可重定义该算法的某些特定步骤。

换句话来说:就是所有重复的代码都应该上升到父类去,而不是让每个子类都去重复


代码实现

目录结构



具体代码

Client类、调用对应的试卷即可。
package controller;

import service.Impl.TestPaperA;
import service.Impl.TestPaperB;
import service.TestPaper;

/**
 * @author SHshuo
 * @data 2021/10/16--15:07
 * 模板方法模式
 */
public class Client {
    public static void main(String[] args) {
        TestPaper testPaperA = new TestPaperA();
        testPaperA.TemplateMethod();

        TestPaper testPaperB = new TestPaperB();
        testPaperB.TemplateMethod();
    }
}

TestPaper类为父类、应该将答案抽象出来、子类重写对应的答案。而不是子类继承父类重写对应的问题和答案。
package service;

/**
 * @author SHshuo
 * @data 2021/10/16--15:08
 * 定义模板、将答案抽象出来,而不是子类重写每一个问题和答案
 */
public class TestPaper {

    public void TemplateMethod(){
        question1();
        question2();
        question3();
    }

    public void question1(){
        System.out.println("2 > 1 : true ? false");
        System.out.println("答案:" + answer1());
    }

    public void question2(){
        System.out.println("4 > 5 : true ? false");
        System.out.println("答案:" + answer2());
    }

    public void question3(){
        System.out.println("7 > 1 : true ? false");
        System.out.println("答案:" + answer3());
    }


    public String answer1(){
        return "";
    }

    public String answer2(){
        return "";
    }

    public String answer3(){
        return "";
    }
}

TestPaperA、TestPaperB继承TestPaper,重写对应的答案即可。
package service.Impl;

import service.TestPaper;

/**
 * @author SHshuo
 * @data 2021/10/16--15:08
 * 只需要重写答案即可
 */
public class TestPaperA extends TestPaper {
    @Override
    public String answer1() {
        return "true";
    }

    @Override
    public String answer2() {
        return "false";
    }

    @Override
    public String answer3() {
        return "true";
    }
}

UML类图