模板方法模式(Template Method),定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
模板方法模式主要涉及到2個部分:
- 抽象類:實現了一個模板方法,定義了算法的骨架,具體子類將重定義不同的部分以實現一個算法的步驟。
- 具體子類:實現本子類特有的部分,以完成算法中與特定子類相關的步驟。
筆者下文的例子中,鮮花作為抽象類,定義了 display(展示) 這個骨架。鮮花的展示需要用到鮮花的顏色,但不同的鮮花有不同的顏色,所以展示顏色這個步驟延遲到具體鮮花子類中。玫瑰花和百合花作為具體子類分別重寫了 displayColor(展示顏色) 這個方法。
模板方法模式類圖
- 鮮花抽象類
public abstract class Flower {
public void display() {
System.out.println("I need water");
displayColor();
}
public abstract void displayColor();
}
- 玫瑰花類
public class Rose extends Flower{
@Override
public void displayColor() {
System.out.println("I have red color");
}
}
- 百合花類
public class Lily extends Flower {
@Override
public void displayColor() {
System.out.println("I have white color");
}
}
- 客戶端測試類
public class Client {
public static void main(String[] args) {
Flower flower = new Rose();
flower.display();
flower = new Lily();
flower.display();
}
}
運行結果:
I need water
I have red color
I need water
I have white color
模板方法模式體現了基于繼承的代碼復用技術,應用場景在于某個方法的實現需要多個步驟,其中有些步驟是固定的,而另一些步驟是變化的,那么把固定的步驟提取到父類中去做,把變化的部分放在不同的子類中。