設計模式之模板方法模式

1、簡述

寫簡歷的時候,咱們一般會找好一個模板,以後往模板上填充上我的信息、項目信息就構成了本身的簡歷。這種經過通用格式、通用模板來構建新對象的方式,在編程上就是「模板方法模式」編程

2、例子

假設這麼個場景:咱們但願出試卷的老師,可以出一套統一格式的試卷,無論是什麼科目,都有選擇題、判斷題、簡答題,那咱們就能夠使用模版模式。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

3、應用

模版模式在Java中有普遍的應用,如ArrayQueue、ArrayList都繼承AbstractList、將通用的代碼抽象在AbstractList這模版類中。同時經過抽象方法、指定了具體實現類須要實現的方法。orm

4、總結

一、模版方法模式能夠經過模版抽象出一些公共的代碼,如上面例子中getTestPaper()方法,這個方法是通用的獲取試卷的方法,不須要每份試卷都單獨去實現。二、同時模版又給具體實現規範了需實現的內容。如上,規定了每一個學科類型試卷都須要有選擇、判斷、簡單題。對象

相關文章
相關標籤/搜索