標籤:
需求:
學生抄題目,做題目
初始代碼
# -*- encoding: utf-8 -*-#學生甲的試卷類class TestPaperA def question1 puts ‘楊過得到,後來給了郭靖,煉成倚天劍,屠龍刀的玄鐵可能是[] a.球墨鑄鐵 b.馬口鐵 c.高速合金鋼 d.碳塑纖維 ‘ puts ‘答案:b‘ end def question2 puts ‘楊過、程英、陸無雙剷除了情花,造成了[] a.使這種植物不再害人 b.使一種珍稀物種滅絕 c.破壞了那個生物圈的生態平衡 d.造成該地區沙漠化 ‘ puts ‘答案:a‘ end def question3 puts ‘藍鳳凰的致使華山師徒、桃穀六仙嘔吐不止,如果你是大夫,會給他們開什麼藥[] a.阿司匹林 b.牛黃解毒片 c.氟酸 d.讓他們喝大量的生牛奶 e.以上全不對‘ puts ‘答案:c‘ endend#學生乙的試卷類class TestPaperB def question1 puts ‘楊過得到,後來給了郭靖,煉成倚天劍,屠龍刀的玄鐵可能是[] a.球墨鑄鐵 b.馬口鐵 c.高速合金鋼 d.碳塑纖維 ‘ puts ‘答案:d‘ end def question2 puts ‘楊過、程英、陸無雙剷除了情花,造成了[] a.使這種植物不再害人 b.使一種珍稀物種滅絕 c.破壞了那個生物圈的生態平衡 d.造成該地區沙漠化 ‘ puts ‘答案:b‘ end def question3 puts ‘藍鳳凰的致使華山師徒、桃穀六仙嘔吐不止,如果你是大夫,會給他們開什麼藥[] a.阿司匹林 b.牛黃解毒片 c.氟酸 d.讓他們喝大量的生牛奶 e.以上全不對‘ puts ‘答案:a‘ endendputs ‘學生甲抄的試卷‘student1 = TestPaperA.newstudent1.question1student1.question2student1.question3puts ‘學生乙抄的試卷‘student2 = TestPaperB.newstudent2.question1student2.question2student2.question3
存在的問題:
TestPaperA和TestPaperB中的代碼很多相同的地方,不利於維護,如果需要修改題目的話,就要改兩處
改後的代碼
# -*- encoding: utf-8 -*-class TestPaper def question1 puts ‘楊過得到,後來給了郭靖,煉成倚天劍,屠龍刀的玄鐵可能是[] a.球墨鑄鐵 b.馬口鐵 c.高速合金鋼 d.碳塑纖維 ‘ end def question2 puts ‘楊過、程英、陸無雙剷除了情花,造成了[] a.使這種植物不再害人 b.使一種珍稀物種滅絕 c.破壞了那個生物圈的生態平衡 d.造成該地區沙漠化 ‘ end def question3 puts ‘藍鳳凰的致使華山師徒、桃穀六仙嘔吐不止,如果你是大夫,會給他們開什麼藥[] a.阿司匹林 b.牛黃解毒片 c.氟酸 d.讓他們喝大量的生牛奶 e.以上全不對‘ endend#學生甲的試卷類class TestPaperA < TestPaper def question1 super puts ‘答案:b‘ end def question2 super puts ‘答案:a‘ end def question3 super puts ‘答案:c‘ endend#學生乙的試卷類class TestPaperB < TestPaper def question1 super puts ‘答案:d‘ end def question2 super puts ‘答案:b‘ end def question3 super puts ‘答案:a‘ endendputs ‘學生甲抄的試卷‘student1 = TestPaperA.newstudent1.question1student1.question2student1.question3puts ‘學生乙抄的試卷‘student2 = TestPaperB.newstudent2.question1student2.question2student2.question3
可以看出,抽取出來一個公用的試卷類,讓甲乙去繼承,公用其中的試題。這時再看TestPaperA和TestPaperB,不同的只有答案a、b、c、d不一樣,其他的都一樣。
# -*- encoding: utf-8 -*-class TestPaper def question1 puts ‘楊過得到,後來給了郭靖,煉成倚天劍,屠龍刀的玄鐵可能是[] a.球墨鑄鐵 b.馬口鐵 c.高速合金鋼 d.碳塑纖維 ‘ puts "答案:#{answer1}" end def question2 puts ‘楊過、程英、陸無雙剷除了情花,造成了[] a.使這種植物不再害人 b.使一種珍稀物種滅絕 c.破壞了那個生物圈的生態平衡 d.造成該地區沙漠化 ‘ puts "答案:#{answer2}" end def question3 puts ‘藍鳳凰的致使華山師徒、桃穀六仙嘔吐不止,如果你是大夫,會給他們開什麼藥[] a.阿司匹林 b.牛黃解毒片 c.氟酸 d.讓他們喝大量的生牛奶 e.以上全不對‘ puts "答案:#{answer3}" end def answer1; end def answer2; end def answer3; endend#學生甲的試卷類class TestPaperA < TestPaper def answer1 ‘b‘ end def answer2 ‘a‘ end def answer3 ‘c‘ endend#學生乙的試卷類class TestPaperB < TestPaper def answer1 ‘d‘ end def answer2 ‘b‘ end def answer3 ‘a‘ endendputs ‘學生甲抄的試卷‘student1 = TestPaperA.newstudent1.question1student1.question2student1.question3puts ‘學生乙抄的試卷‘student2 = TestPaperB.newstudent2.question1student2.question2student2.question3
這裡將TestPaperA和TestPaperB中的答案抽離到了父類中,僅僅儲存不同的部分。
父類成為子類的模板,所有重複的代碼都應該上升到父類去,而不是讓每個子類都去重複。
當我們要完成在某一細節層次一致的過程或一系列步驟,但其個別步驟在更詳細層次上的實現可能不同時,我們通常考慮使用模板方法模式來處理。
《大話設計模式》ruby版代碼:模板方法模式