小时候数学老师的随堂测验,都是在黑板上抄题目,然后再作答案。写一个抄题目的程序。
/**
* 学生甲抄的试卷
* Created by callmeDevil on 2019/7/14.
*/
public class TestPaperA {
// 试题1
public void testQuestion1(){
System.out.println("路飞在顶上战争之后,修炼了多久? a.3天 b.2年 c.2天 d.3年");
System.out.println("答案:b");
}
// 试题2
public void testQuestion2(){
System.out.println("鸣人是第几代火影? a.六代 b.七代 c.八代 d.九代");
System.out.println("答案:b");
}
}
/**
* 学生乙抄的试卷
* Created by callmeDevil on 2019/7/14.
*/
public class TestPaperB {
// 试题1
public void testQuestion1(){
System.out.println("路飞在顶上战争之后,修炼了多久? a.3天 b.2年 c.2天 d.3年");
System.out.println("答案:a");
}
// 试题2
public void testQuestion2(){
System.out.println("鸣人是第几代火影? a.六代 b.七代 c.八代 d.九代");
System.out.println("答案:a");
}
}
public class Test {
public static void main(String[] args) {
System.out.println("学生甲抄的试卷:");
TestPaperA studentA = new TestPaperA();
studentA.testQuestion1();
studentA.testQuestion2();
System.out.println("学生乙抄的试卷:");
TestPaperB studentB = new TestPaperB();
studentB.testQuestion1();
studentB.testQuestion2();
}
}
学生甲抄的试卷:
路飞在顶上战争之后,修炼了多久? a.3天 b.2年 c.2天 d.3年
答案:b
鸣人是第几代火影? a.六代 b.七代 c.八代 d.九代
答案:b
学生乙抄的试卷:
路飞在顶上战争之后,修炼了多久? a.3天 b.2年 c.2天 d.3年
答案:a
鸣人是第几代火影? a.六代 b.七代 c.八代 d.九代
答案:a
两个学生抄试卷都非常类似,除了答案不同,没什么不一样,这样又容易错,又难以维护。因此老师出一份试卷,打印多份,让学生填写答案就可以了。应该把试题和答案分离,抽出一个父类,让两个子类继承它,公共的试题代码写到父类当中就行了。
/**
* 试题父类-动漫考题
* Created by callmeDevil on 2019/7/14.
*/
public class TestPaper {
// 试题1
public void testQuestion1(){
System.out.println("路飞在顶上战争之后,修炼了多久? a.3天 b.2年 c.2天 d.3年");
}
// 试题2
public void testQuestion2(){
System.out.println("鸣人是第几代火影? a.六代 b.七代 c.八代 d.九代");
}
}
/**
* 学生甲抄的试卷-版本2
* Created by callmeDevil on 2019/7/14.
*/
public class TestPaperA2 extends TestPaper{
@Override
public void testQuestion1() {
super.testQuestion1();
System.out.println("答案:b");
}
@Override
public void testQuestion2() {
super.testQuestion2();
System.out.println("答案:b");
}
}
/**
* 学生乙抄的试卷-版本2
* Created by callmeDevil on 2019/7/14.
*/
public class TestPaperB2 extends TestPaper{
@Override
public void testQuestion1(){
super.testQuestion1();
System.out.println("答案:a");
}
@Override
public void testQuestion2(){
super.testQuestion2();
System.out.println("答案:a");
}
}
客户端测试代码与测试结果此处省略,同上述简单实现。
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。
/**
* 模板方法父类-动漫考题
* Created by callmeDevil on 2019/7/14.
*/
public abstract class TestPaper {
// 试题1
public void testQuestion1(){
System.out.println("路飞在顶上战争之后,修炼了多久? a.3天 b.2年 c.2天 d.3年");
System.out.println("答案:" + answer1());//改成一个虚方法,下同
}
// 试题2
public void testQuestion2(){
System.out.println("鸣人是第几代火影? a.六代 b.七代 c.八代 d.九代");
System.out.println("答案:" + answer2());
}
// 此方法的目的就是给继承的子类重写,因为这里每个人的答案都是不同的
public abstract String answer1();
public abstract String answer2();
}
/**
* 学生甲抄的试卷-模板方法实现
* Created by callmeDevil on 2019/7/14.
*/
public class TestPaperA3 extends TestPaper{
@Override
public String answer1() {
return "b";
}
@Override
public String answer2() {
return "b";
}
}
/**
* 学生乙抄的试卷-模板方法实现
* Created by callmeDevil on 2019/7/14.
*/
public class TestPaperB3 extends TestPaper{
@Override
public String answer1() {
return "a";
}
@Override
public String answer2() {
return "a";
}
}
/**
* 模板方法测试
* Created by callmeDevil on 2019/7/14.
*/
public class Test3 {
public static void main(String[] args) {
System.out.println("学生甲抄的试卷:");
// 将子类变量的声明改成父类,利用多态性实现了代码的复用
TestPaper studentA = new TestPaperA3();
studentA.testQuestion1();
studentA.testQuestion2();
System.out.println("学生乙抄的试卷:");
TestPaper studentB = new TestPaperB3();
studentB.testQuestion1();
studentB.testQuestion2();
}
}
测试结果是一致的,此处不再贴出。
原文:https://www.cnblogs.com/call-me-devil/p/11184272.html