寫簡歷的時候,咱們一般會找好一個模板,以後往模板上填充上我的信息、項目信息就構成了本身的簡歷。這種經過通用格式、通用模板來構建新對象的方式,在編程上就是「模板方法模式」。編程
假設這麼個場景:咱們但願出試卷的老師,可以出一套統一格式的試卷,無論是什麼科目,都有選擇題、判斷題、簡答題,那咱們就能夠使用模版模式。bash
咱們先把模版類定義好markdown
package com.design.template; public abstract class PaperTemplate { /** * 選擇題 */ protected abstract void choiceQuestion(); /** * 判斷題 */ protected abstract void trueOrFalseQuestion(); /** * 簡答題 */ protected abstract void shortAnswerQuestion(); /** * 獲取整張試卷內容 */ public void getTestPaper(){ choiceQuestion(); trueOrFalseQuestion(); shortAnswerQuestion(); } }複製代碼
接下來就經過擴展這個模版來構建具體的試卷、好比數學試卷app
package com.design.template; public class MathPaper extends PaperTemplate { @Override protected void choiceQuestion() { System.out.println("選擇題:"); System.out.println("一、不小於-4的非正整數有()\n" + "A、5個 " + "B、4個\n" + "C、3個 " + "D、2個"); System.out.println("二、若是兩個有理數在數軸上的對應點分別在原點的兩側,那麼這兩個數的商必定是()\n" + "A、正數 " + "B、負數\n" + "C、0 " + "D、多是正數或負數"); } @Override protected void trueOrFalseQuestion() { System.out.println("判斷題:"); System.out.println("一、兩個數的積是正數,那麼這兩個數的商也是正數 []"); System.out.println("二、-a必定表示負數。 []"); } @Override protected void shortAnswerQuestion() { System.out.println("簡答題:"); System.out.println("一、出租司機小張某天下午的營運全是在到西走向的大街上進行的,若規定向東爲正,向西爲負,他這天下午行車裏程(單位:公里)記錄以下: +8,-3,+15,-10,-13,+3,-15,+11,-12 (7分)\n" + "(1)將最後一名乘客送到目的地時,小張距下午出車點的距離是多少公里?\n" + "(2)若汽車耗油量爲0.08升/公里,這天下午汽車共耗油多少升?"); } }複製代碼
再經過這套模塊生成一套化學題ide
package com.design.template; public class ChemistryPaper extends PaperTemplate { @Override protected void choiceQuestion() { System.out.println("選擇題:"); System.out.println("一、只發生物理變化的是( )\n" + "A、礦石粉碎 " + "B、紙張燃燒\n" + "C、光合做用 " + "D、鐵釘生鏽"); System.out.println("二、下列生活中常見的一些變化,其中屬於化學變化的是 ( )\n" + "A、夏天雪糕慢慢融化 " + "B、潮溼的衣服在空氣中變幹\n" + "C、洗淨的鐵鍋出現鏽跡 " + "D、夏天從冰箱取出的瓶子外壁附着一層水珠"); } @Override protected void trueOrFalseQuestion() { System.out.println("判斷題:"); System.out.println("一、果糖、葡萄糖、麥芽糖都是具備甜味的晶體。 []"); System.out.println("二、澱粉、油脂、蛋白質和纖維素都屬於高分子且一般是混合物。 []"); } @Override protected void shortAnswerQuestion() { System.out.println("推斷簡答:"); System.out.println("A、B、C、D、E五種元素中,A的原子中沒有中子;B元素的單質能供給動植物呼吸;C是主要存在於人體骨骼和牙齒中的金屬元素;D元素的單質在空氣中含量最多;E是組成化合物種類最多的元素.請回答下列問題.\n" + "(1)A和D的元素符號依次是_____、 ______.\n" + "(2)由上述元素組成的兩種非金屬單質發生反應的化學方程式是 、 .\n" + "(3)由A、B、C三種元素組成的物質與鹽酸反應的化學方程式 .\n" + "(4)由A、B、D、E四種元素組成一種鹽的化學式 ,該鹽的一種用途是 ."); } }複製代碼
接下來就能夠使用這些試卷了
spa
public class Main { public static void main(String[] args) { System.out.println("***********數學題***********"); PaperTemplate mathPapper = new MathPaper(); mathPapper.getTestPaper(); System.out.println("***********化學題***********"); PaperTemplate chemistryPaper = new ChemistryPaper(); chemistryPaper.getTestPaper(); } }複製代碼
執行結果3d
能夠看到、經過定義模版,便可統一格式、讓全部使用這個模版的試卷具備相同題目類型、相同格式、這就是模版模式。code
模版模式在Java中有普遍的應用,如ArrayQueue、ArrayList都繼承AbstractList、將通用的代碼抽象在AbstractList這模版類中。同時經過抽象方法、指定了具體實現類須要實現的方法。orm
一、模版方法模式能夠經過模版抽象出一些公共的代碼,如上面例子中getTestPaper()方法,這個方法是通用的獲取試卷的方法,不須要每份試卷都單獨去實現。二、同時模版又給具體實現規範了需實現的內容。如上,規定了每一個學科類型試卷都須要有選擇、判斷、簡單題。對象