《大話設計模式》ruby版代碼:模板方法模式

來源:互聯網
上載者:User

標籤:

需求:

學生抄題目,做題目

初始代碼

# -*- 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版代碼:模板方法模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.