什麼是Template Method模式
Template Method模式是帶有模板功能的模式,組成模板的方法定義在父類中。由於這些方法是抽象的,所以只查看父類的代碼是無法知道這些方法會進行具體的處理。唯一知道的就是父類如何調用這些方法。這些抽象類在子類中進行實現,不同的子類,父類模板方法被調用時程序也會不同。但是無論如何實現,處理的流程都會按照父類中所定義那樣進行。
像這樣在父類中定義處理流程的框架,在子類事項具體處理的模式就稱爲Template Method模式。
示例程序
package Class;
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public final void display() {
open();
for(int i=0;i<5;i++) {
print();
}
close();
}
}
package Class;
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch=ch;
}
@Override
public void open() {
System.out.println("<<");
}
@Override
public void print() {
System.out.println(ch);
}
@Override
public void close() {
System.out.println(">>");
}
}
package Class;
public class StringDisplay extends AbstractDisplay {
private String string;
private int width;
public StringDisplay(String string) {
this.string=string;
}
@Override
public void open() {
printLine();
}
private void printLine() {
System.out.println("+");
for(int i=0;i<width;i++) {
System.out.println("-");
}
System.out.println("+");
}
@Override
public void print() {
System.out.println("|"+string+"|");
}
@Override
public void close() {
printLine();
}
}
package Class;
public class Main {
public static void main(String[] args) {
AbstractDisplay d1=new CharDisplay('H');
AbstractDisplay d2=new StringDisplay("Hello World!");
AbstractDisplay d3=new StringDisplay("你好世界");
d1.display();
d2.display();
d3.display();
}
}
相關的設計模式
Factory Method模式
Strategy模式
延伸閱讀:類的層次與抽象類
父類對子類的要求
我們在理解類的層次時,通常是站在子類的角度考慮進行思考的。也就是說,很容易着眼於一下幾點:
1、在子類中可以使用父類中定義的方法。
2、可以通過在子類中增加方法以實現新的功能。
3、在子類中重寫父類的方法可以改變程序的行爲。
站在父類的角度思考。在父類中,我們聲明瞭抽象方法,而將該方法的實現交給了子類。換言之,就程序而言。聲明抽象方法是希望達到以下目的:
1、期待子類去實現抽象方法。
2、要求子類去實現抽象方法。
也就是說,子類具有實現在父類中所聲明的抽象方法的責任。因此這種責任被稱爲“子類責任”。
抽象類的意義
對於抽象類。我們是無法生成實例的。由於在抽象方法中並沒有寫具體的實現,所以我們無法知道抽象方法到底進行了什麼處理。但我們可以決定抽象方法的名字,然後通過調用使用了抽象方法的模板方法去編寫處理。雖然具體處理美瞳是由子類決定的,不過在抽象結對確定處理流程非常重要。
父類與子類之間的協作
父類與子類的相互協作支撐起了整個程序。雖然將更多的方法實現放在了父類會讓子類變得更輕鬆,但是同時也降低了子類的靈活性;繁殖,如果父類中實現的方法過少,子類就會變得臃腫不堪。而且還會導致各子類間的代碼重讀、