1.不同学生ab做题除了答案不同,其他都一样如下:

试卷类:

/**
* @author dxy
* @version 1.0
* @date 2021/10/24 18:10
* @decripton 试题
* @mail victorydeng@163.com
*/
public class ExamPaper {
public void question1() {
System.out.println("以下不是四大名著的是:a 红楼梦 b 西游记 c 三国演义 d 牡丹亭");
}

public void question2() {
System.out.println("以下不是四大发明的是:a 火药 b 造纸术 c 雷达 d 指南针");
}

public void question3() {
System.out.println("以下不是四大文明古国的是:a 古巴比伦 b 古埃及 c 中国 d 希腊");
}
}

学生a的试卷:

/**
* @author dxy
* @version 1.0
* @date 2021/10/24 18:16
* @decripton 学生a的试卷
* @mail victorydeng@163.com
*/
public class StudentAsPaper extends ExamPaper {
@Override
public void question1() {
super.question1();
System.out.println("学生a的答案:a");
}

@Override
public void question2() {
super.question2();
System.out.println("学生a的答案:a");
}

@Override
public void question3() {
super.question3();
System.out.println("学生a的答案:a");
}
}

学生B的试卷:

/**
* @author dxy
* @version 1.0
* @date 2021/10/24 18:18
* @decripton 学生b的试卷
* @mail victorydeng@163.com
*/
public class StudentBsPaper extends ExamPaper {
@Override
public void question1() {
super.question1();
System.out.println("学生b的答案:b");
}

@Override
public void question2() {
super.question2();
System.out.println("学生b的答案:b");
}

@Override
public void question3() {
super.question3();
System.out.println("学生b的答案:b");
}
}

测试方法:

/**
* @author dxy
* @version 1.0
* @date 2021/10/24 18:23
* @decripton 测试方法
* @mail victorydeng@163.com
*/
public class Test {
public static void main(String[] args) {
System.out.println("------学生a的试卷start-------");
StudentAsPaper studentAsPaper = new StudentAsPaper();
studentAsPaper.question1();
studentAsPaper.question2();
studentAsPaper.question3();
System.out.println("------学生a的试卷end-------");

System.out.println("------学生b的试卷start-------");
StudentBsPaper studentBsPaper = new StudentBsPaper();
studentBsPaper.question1();
studentBsPaper.question2();
studentBsPaper.question3();
System.out.println("------学生b的试卷end-------");
}
}

结果·:

万恶的考试模版方法模式_ide

可以看到a和b的类非常类似,除了答案不同,没什么不一样,这样写又容易错,又难以维护

2.模版方法模式

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。

类图:

万恶的考试模版方法模式_1024程序员节_02

我们给ExamPaper类增加3个回答试题的抽象方法如下:

/**
* @author dxy
* @version 1.0
* @date 2021/10/24 18:10
* @decripton 试题
* @mail victorydeng@163.com
*/
public abstract class ExamPaper {
public void question1() {
System.out.println("以下不是四大名著的是:a 红楼梦 b 西游记 c 三国演义 d 牡丹亭");
System.out.println(this.answer1());

}

public void question2() {
System.out.println("以下不是四大发明的是:a 火药 b 造纸术 c 雷达 d 指南针");
System.out.println(this.answer2());
}

public void question3() {
System.out.println("以下不是四大文明古国的是:a 古巴比伦 b 古埃及 c 中国 d 希腊");
System.out.println(this.answer3());
}

public abstract String answer1();

public abstract String answer2();

public abstract String answer3();

}

修改后的studentA:

public class StudentAsPaper extends ExamPaper {
@Override
public String answer1() {
return "学生a的答案:a";
}

@Override
public String answer2() {
return "学生a的答案:a";
}

@Override
public String answer3() {
return "学生a的答案:a";
}


}

修改后的b的:

/**
* @author dxy
* @version 1.0
* @date 2021/10/24 18:18
* @decripton 学生b的试卷
* @mail victorydeng@163.com
*/
public class StudentBsPaper extends ExamPaper {
@Override
public String answer1() {
return "学生b的答案:b";
}

@Override
public String answer2() {
return "学生b的答案:b";
}

@Override
public String answer3() {
return "学生b的答案:b";
}
}

测试:

/**
* @author dxy
* @version 1.0
* @date 2021/10/24 18:23
* @decripton 测试方法
* @mail victorydeng@163.com
*/
public class Test {
public static void main(String[] args) {
System.out.println("------学生a的试卷start-------");
ExamPaper studentAsPaper = new StudentAsPaper(); //利用多态 子类声明改成父类
studentAsPaper.question1();
studentAsPaper.question2();
studentAsPaper.question3();
System.out.println("------学生a的试卷end-------");

System.out.println("------学生b的试卷start-------");
ExamPaper studentBsPaper = new StudentBsPaper();
studentBsPaper.question1();
studentBsPaper.question2();
studentBsPaper.question3();
System.out.println("------学生b的试卷end-------");
}
}

结果:

万恶的考试模版方法模式_ide_03

3.总结:

模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。模板方法模式就是提供了一个很好的代码复用平台。因为有时候,我们会遇到由系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但有些步骤的实现可能不同。这时候,我们通常就应该要考虑用模板方法模式了。