1. 程式人生 > >設計模式從零開始——模板方法模式

設計模式從零開始——模板方法模式

“橫看成嶺側成峰,遠近高低各不同”

說的就是山是同一座山,但是不同的人站在不同的角度,看到的山的樣子也不一樣。就像最近在看一檔節目,叫做《最強大腦》,裡面都是天才、神童、天之驕子,都是站在智商頂峰的一群人,對於節目中難到變態的題目,我只會笑一笑然後放棄,但是那些天才們經過一陣頭腦風暴後,問題總會迎刃而解。題目還是那些題目,但是對於答題的人來講,答案卻是五花八門。

說了這麼多,就是為了引出今天要說的設計模式——【模板方法模式】。所謂模板,就是固定下來不變的東西,比如考試時的試卷,每個人的領到的試卷題目都是相同的,但是考試的人給出的答案就有對有錯,這就是模板方法模式:定義一個操作中的演算法骨架,而將一些步驟延遲到子類中,模板方法是的子類可以不改變一個演算法的結構,即可定義該演算法的某些特定步驟。

就拿學生答題舉例,試卷就是模板,學生的答案就是子類的方法,程式碼如下:

試卷類:

public class TestPaper {
    public void QuestionA() {
        System.out.print("試題一:A.x B.x C.x D.x  ");
        System.out.println("答案為:" + AnswerA());
    }

    protected String AnswerA() {
        return "";
    }

    public void QuestionB() {
        System.out.print("試題二:A.x B.x C.x D.x  ");
        System.out.println("答案為:" + AnswerB());
    }

    protected String AnswerB() {
        return "";
    }

    public void QuestionC() {
        System.out.print("試題三:A.x B.x C.x D.x  ");
        System.out.println("答案為:" + AnswerC());
    }

    protected String AnswerC() {
        return "";
    }
}
學生A:

public class StudentA extends TestPaper {
    @Override
    protected String AnswerA() {
        return "A";
    }
    @Override
    protected String AnswerB() {
        return "B";
    }
    @Override
    protected String AnswerC() {
        return "C";
    }
}

學生B:

public class StudentB extends TestPaper {
    @Override
    protected String AnswerA() {
        return "A";
    }
    @Override
    protected String AnswerB() {
        return "B";
    }
    @Override
    protected String AnswerC() {
        return "C";
    }
}

客戶端:

public class Paper {
    public static void main(String[] args) {
        TestPaper answerA = new StudentA();
        System.out.println("學生A:");
        answerA.QuestionA();
        answerA.QuestionB();
        answerA.QuestionC();
        TestPaper answerB = new StudentB();
        System.out.println("學生B:");
        answerB.QuestionA();
        answerB.QuestionB();
        answerB.QuestionC();
    }
}
輸出結果: