1. 程式人生 > >《大話設計模式》Java程式碼示例(七)之模板方法模式

《大話設計模式》Java程式碼示例(七)之模板方法模式

模板方法模式:定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。

package templatemethod;

/**
 * 模板方法模式(Template Method)
 * 試卷父類
 */
public abstract class TestPaper {

    public void testQuestion1() {
        System.out.println("楊過得到,後來給了郭靖,煉成倚天劍、屠龍刀的玄鐵可能是( )" +
                "  a.球墨鑄鐵 b.馬口鐵 c.高速合金鋼 d.碳素纖維");
        System.out.println("答案:" + Answer1());
    }

    public void testQuestion2() {
        System.out.println("楊過、程英、陸無雙剷除了情花,造成( )" +
                "  a.使這種植物不再害人 b.使一種珍稀物種滅絕 c.破壞了那個生物圈的生態平衡 d.造成該地區沙漠化");
        System.out.println("答案:" + Answer2());
    }

    public void testQuestion3() {
        System.out.println("藍鳳凰致使華山師徒、桃谷六仙嘔吐不止,如果你是大夫,會給他們開什麼藥( )" +
                "  a.阿司匹林 b.牛黃解毒片 c.氟哌酸 d.讓他們喝大量的生牛奶 e.以上全不對");
        System.out.println("答案:" + Answer3());
    }

    protected abstract String Answer1();

    protected abstract String Answer2();

    protected abstract String Answer3();

}


package templatemethod;

/**
 * 模板方法模式(Template Method)
 * 學生A抄的試卷
 */
public class TestPaperA extends TestPaper {

    @Override
    protected String Answer1() {
        return "b";
    }

    @Override
    protected String Answer2() {
        return "c";
    }

    @Override
    protected String Answer3() {
        return "a";
    }

}
package templatemethod;

/**
 * 模板方法模式(Template Method)
 * 學生B抄的試卷
 */
public class TestPaperB extends TestPaper {

    @Override
    protected String Answer1() {
        return "c";
    }

    @Override
    protected String Answer2() {
        return "a";
    }

    @Override
    protected String Answer3() {
        return "a";
    }

}
package templatemethod;

/**
 * 模板方法模式(Template Method)
 * 客戶端main方法
 */
public class Client {

    public static void main(String[] args) {
        System.out.println("學生A抄的試卷:");
        TestPaper studentA = new TestPaperA();
        studentA.testQuestion1();
        studentA.testQuestion2();
        studentA.testQuestion3();

        System.out.println("學生B抄的試卷:");
        TestPaper studentB = new TestPaperB();
        studentB.testQuestion1();
        studentB.testQuestion2();
        studentB.testQuestion3();

    }

}