定義:一個操作中的算法的骨架,而將一些步驟延遲到子類中。模版方法可以使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟
還是上例子
首先定義的是父類,也就是定義了今天問題的模版,包含兩個測試,每個測試包含題目與答案,在本例子中,答案是每個人的不同結果,所以這裏將answer1
和 answer2
放到子類中去實現,
public abstract class PaPerTest
{
public void question1()
{
System.out.println("questionA");
System.out.println("答案" + answer1());
}
public void question2()
{
System.out.println("questionB");
System.out.println("答案" + answer2());
}
abstract public String answer1();
abstract public String answer2();
}
第一個子類,只要給出兩個問題的答案就可以了,
public class PaPerTestA extends PaPerTest
{
@Override
public String answer1()
{
return "a";
}
@Override
public String answer2()
{
return "b";
}
}
第二個子類,同上,也只是給出答案即可
public class PaperTestB extends PaPerTest
{
@Override
public String answer1()
{
return "c";
}
@Override
public String answer2()
{
return "d";
}
}
客戶端調用代碼,這裏PaPerTest a = new PaPerTestA();
將子類實例化到父類,也就調用了父類的方法;同時因爲實例化的是不同的子類,answer1
和 answer2
也都是調用的對應的子類的實現,這樣就可以把實現放到客戶端調用時
public class TemplateMain
{
public static void main(String[] args)
{
PaPerTest a = new PaPerTestA();
a.question1();
a.question2();
PaPerTest b = new PaperTestB();
b.question1();
b.question2();
}
}
總結
模版模式也是將父類的方法放到子類中去實現,將類的實例化延遲到調用時,也就是面向對象編程的多態性,JAVA
本來就是全虛類的,本身就支持這種延遲實例化