Template Method模式

什麼是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、要求子類去實現抽象方法。

也就是說,子類具有實現在父類中所聲明的抽象方法的責任。因此這種責任被稱爲“子類責任”。

抽象類的意義

對於抽象類。我們是無法生成實例的。由於在抽象方法中並沒有寫具體的實現,所以我們無法知道抽象方法到底進行了什麼處理。但我們可以決定抽象方法的名字,然後通過調用使用了抽象方法的模板方法去編寫處理。雖然具體處理美瞳是由子類決定的,不過在抽象結對確定處理流程非常重要。

父類與子類之間的協作

父類與子類的相互協作支撐起了整個程序。雖然將更多的方法實現放在了父類會讓子類變得更輕鬆,但是同時也降低了子類的靈活性;繁殖,如果父類中實現的方法過少,子類就會變得臃腫不堪。而且還會導致各子類間的代碼重讀、

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章