小时候数学老师的随堂测验,都是在黑板上抄题目,而后再做答案。写一个抄题目的程序。算法
/** * 学生甲抄的试卷 * 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
两个学生抄试卷都很是相似,除了答案不一样,没什么不同,这样又容易错,又难以维护。所以老师出一份试卷,打印多份,让学生填写答案就能够了。应该把试题和答案分离,抽出一个父类,让两个子类继承它,公共的试题代码写到父类当中就好了。ide
/** * 试题父类-动漫考题 * 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"); } }
客户端测试代码与测试结果此处省略,同上述简单实现。测试
定义一个操做中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够不改变一个算法的结构便可重定义该算法的某些特定的步骤。code
/** * 模板方法父类-动漫考题 * 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(); } }
测试结果是一致的,此处再也不贴出。blog