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-------");
}
}
结果·:
可以看到a和b的类非常类似,除了答案不同,没什么不一样,这样写又容易错,又难以维护
2.模版方法模式
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
类图:
我们给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-------");
}
}
结果:
3.总结:
模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。模板方法模式就是提供了一个很好的代码复用平台。因为有时候,我们会遇到由系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但有些步骤的实现可能不同。这时候,我们通常就应该要考虑用模板方法模式了。