1.Template Method模式:
在父類(抽象類)中定義處理流程的框架(父類的抽象方法),
在子類中實現具體的處理(實現父類的抽象方法)。
2.示例程序
共4個類:
AbstractDisplay :
定義非抽象普通方法display();
定義抽象方法open(),print(),close()(由子類實現);
在display()中依次調用了open(),print(),close()這3個方法(即實現display());
CharDisplay:
繼承AbstractDisplay ,實現AbstractDisplay 中的抽象方法open(),print(),close();
StringDisplay:
繼承AbstractDisplay ,實現AbstractDisplay 中的抽象方法open(),print(),close();
Main:
用於測試程序行爲;
類圖
代碼
AbstractDisplay.java
package com.wang;
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();//循環調用5次
}
close();
}
}
CharDisplay .java
package com.wang;
public class CharDisplay extends AbstractDisplay{
private char ch;//需要顯示的字符
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(ch);
}
@Override
public void close() {
System.out.println(">>");
}
}
StringDisplay.java
package com.wang;
public class StringDisplay extends AbstractDisplay {
private int width;
private String string;
public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + string + "|");
}
@Override
public void close() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < this.width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
Main .java
package com.wang;
public class Main {
public static void main(String[] args) {
//生成一個持有“H”的CharDisplay類實例
AbstractDisplay d1 = new CharDisplay('H');
//生成一個持有“Hello,world”StringDisplay類實例
AbstractDisplay d2 = new StringDisplay("hello,world");
//生成一個持有“你好,世界”的StringDisplay
AbstractDisplay d3 = new StringDisplay("你好,世界.");
d1.display();
d2.display();
d3.display();
}
}
運行結果:
敲黑板敲黑板
System.out.println();//最後的ln相當於/n,表示此句打印會換行。
System.out.print()則不換行打印。
抽象類作用:雖然抽象類不能生成實例看似無用,但實際上可以通過抽象方法的名字在抽象階段裏確定處理的流程,這一點也是非常重要的。