Template Method模式
應用場景
- 當我們要完成在某一細節層次一致的一個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同的時候,我們通常要考慮用模板方法模式解決。
本質
優點
缺點
- 算法骨架不容易升級(模板和子類是非常耦合的,如要對模板中的算法骨架進行變更,會影響子類變化)
角色
- AbstractClass:
定義多個抽象方法、一個模板方法
- ConcreteClass:
具體實現AbstractClass的抽象方法,會被AbstractClass的模板方法所調用
Template Method模式的類圖
示例程序
示例程序的類圖
示例代碼
package templateMethod;
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public void display() {
open();
for(int i=0;i<5;i++) {
print();
}
close();
}
}
package templateMethod;
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(">>");
}
}
package templateMethod;
public class StringDisplay extends AbstractDisplay {
private String str;
private int width;
public StringDisplay(String str) {
super();
this.str = str;
this.width = str.getBytes().length;
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + str + "|");
}
@Override
public void close() {
printLine();
}
}
package templateMethod;
public class Main {
public static void main(String[] args) {
AbstractDisplay d1=new CharDisplay('H');
AbstractDisplay d2=new StringDisplay("Hello,world!");
d1.display();
d2.display();
}
}
拓展思路
邏輯處理通用化
- 在父類的模板方法中編寫算法,子類僅僅需要具體化抽象方法
父類、子類一致性
- 使用父類變量保存子類實例,很好的滿足了里氏代換原則
相關的設計模式
Factory Method模式
- Factory Method模式是Template Method 模式用於生成實例的一個典型例子。
Strategy模式
- 在Template Method模式中,使用繼承改變程序的行爲
- 在Strategy模式中,使用委託改變程序的行爲,Strategy模式用於替換整個算法
滿足的原則