定義:
定義一個操作中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變算法的結構即可重定義該算法的某些特定步驟。
通俗點的理解就是 :完成一件事情,有固定的數個步驟,但是每個步驟根據對象的不同,而實現細節不同;就可以在父類中定義一個完成該事情的總方法,按照完成事件需要的步驟去調用其每個步驟的實現方法。每個步驟的具體實現,由子類完成。
用意:
準備一個抽象類,將部分邏輯以具體的方法實現,然後聲明一些抽象方法交由子類實現剩餘邏輯,用鉤子方法給與子類更大的靈活性。最後,將方法彙總成一個不可改變的模版方法。
角色:
抽象類(AbstractClass):實現了模板方法,定義了算法的骨架。
具體類(ConcreteClass):實現抽象類中的抽象方法,已完成完整的算法。
適用場景:
在某些類的算法中,用了相同的方法,造成代碼的重複。
控制子類擴展,子類必須遵守算法規則。
有多個子類共有的方法,且邏輯相同。
重要的、複雜的方法,可以考慮作爲模板方法。
優點:
封裝不變部分,擴展可變部分。
提取公共代碼,便於維護。
行爲由父類控制,子類實現。
缺點:
每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。
package template;
/*
* 模板模式
*/
public abstract class DodishTemplate {
public abstract void ready();//準備
public abstract void cook();//做菜
public abstract void serving();//上菜
public void cooking(){
this.ready();
this.cook();
this.serving();
}
}
package template;
/*
* 模板模式
*/
public class RadishVeal extends DodishTemplate{
@Override
public void ready() {
System.out.println("準備牛肉、蘿蔔、和配料");
}
@Override
public void cook() {
System.out.println("將牛肉燉七分熟,倒入蘿蔔");
}
@Override
public void serving() {
System.out.println("擺盤,上菜");
}
}
package template;
/*
* 模板模式
*/
public class HalogenChickenFeet extends DodishTemplate{
@Override
public void ready() {
System.out.println("新鮮的雞爪、滷水和香料");
}
@Override
public void cook() {
System.out.println("一起下鍋慢燉,直到入味");
}
@Override
public void serving() {
System.out.println("擺盤,上菜");
}
}
package template;
/*
* 模板模式
*/
public class Dodish {
public static void main(String[] args) {
DodishTemplate dodishTemplate = new RadishVeal();
dodishTemplate.ready();
dodishTemplate.cook();
dodishTemplate.serving();
DodishTemplate doTemplate = new HalogenChickenFeet();
doTemplate.ready();
doTemplate.cook();
doTemplate.serving();
}
}
請關注“知了堂學習社區”,地址:http://www.zhiliaotang.com/portal.php