設計模式(Java)—Template Method模式
阿新 • • 發佈:2019-02-17
Template模式是在父類中定義處理流程的框架,在子類中實現具體處理的模式。
一、示例程式
將字元和字串迴圈顯示5次的程式
在AbstractDisplay類中定義了display方法,而且在該方法中依次呼叫open、print、close這3個方法,雖然這3個方法已經在AbstractDisplay中被聲明瞭,但都是沒有屍體的抽象方法。這裡呼叫抽象方法的display方法就是模板方法。
而實際上實現了open、print、close這3個抽象方法的是AbstractDisplay的子類CharDisplay類和StringDisplay類。
AbstractDisplay類:
package TemplateMethod;
//抽象模板中使用抽象而不是用介面的原因是,抽象模板的父類中有模板方法,模板方法不是抽象方法,而介面中的方法要求全部是抽象的,
//所以這裡不能使用介面,介面中是無法實現方法的
//抽象類中既可以有抽象方法,也可以有普通方法
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
//final欄位在繼承該類的子類中此方法不能被重寫
public final void display(){
open();
for(int i=0;i<5;i++){
print();
}
close();
}
}
CharDisplay類:
package TemplateMethod;
//抽象類的子類,繼承抽象類,實現抽象方法
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
// TODO Auto-generated constructor stub
this.ch = ch;
}
@Override
public void open() {
// TODO Auto-generated method stub
System.out.print("<<");
}
@Override
public void print() {
// TODO Auto-generated method stub
System.out.print(ch);
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println(">>");
}
}
StringDisplay類:
package TemplateMethod;
//抽象類的子類,繼承抽象類,實現抽象方法
public class StringDisplay extends AbstractDisplay {
private String string;
private int width;
public StringDisplay(String string) {
// TODO Auto-generated constructor stub
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void open() {
// TODO Auto-generated method stub
printLine();
}
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println("|"+string+"|");
}
@Override
public void close() {
// TODO Auto-generated method stub
printLine();
}
private void printLine(){
System.out.print("+");
for(int i=0;i<width;i++){
System.out.print("-");
}
System.out.println("+");
}
}
總結:抽象類角色不僅負責實現模板方法,還負責宣告在模板方法中所使用到的抽象方法,此處即程式流程中使用到的演算法,這些抽象方法的實現有具體類實現。
具體類負責實現抽象類角色中定義的抽象方法。