定義乙個操作中的演算法的骨架,而將步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重定義演算法的某些特定步驟。
擴充套件:run()方法可以按照規定的順序執行,也可以由isalarm()方法的返回值影響run()中的執行順序。
模板模式通過定義模板方法抽象類(包含節點方法和執行流程方法兩部分),由具體類繼承後實現各節點方法,最後在主函式中,呼叫具體類物件從模板類中繼承來的執行流程方法。—— 可用在抽象類中定義一套組合拳模板,便於主體呼叫。
一、製造悍馬
1、模式中的角色
抽象類(abstractclass):實現了模板方法,定義了演算法的骨架。
具體類(concreteclass):實現抽象類中的抽象方法,已完成完整的演算法
(基本方法:由子類實現的方法,並且在模板方法被呼叫)
(模板方法:可以有乙個或幾個,一般是乙個具體方法,也就是乙個框架,實現 對基本方法的排程,完成固定的邏輯)
2、抽象悍馬模型
public abstract class hummermodel
}
3、h1型號悍馬模型
public class hummerh1model extends hummermodel
public void stop()
public void alarm()
public void engineboom()
}
4、h2悍馬模型
public class hummerh2model extends hummermodel
public void stop()
public void alarm()
public void engineboom()
}
5、場景類
public class client
}
二、模板方法模式的定義
1、 抽象模板類
public abstract class abstractclass
}
2、 具體模板類
public class concreteclass1 extends abstractclass
protected void doanything()
}
&
public class concreteclass2 extends abstractclass
protected void doanything()
}
3、 場景類
public class clientmodel
}
注意:抽象模板中的基本方法盡量設計為protected型別,符合迪公尺特法則,不需暴露的屬性或方法盡量不要設定為protected型別,實現類若非必要,盡量不要擴大父類中的訪問許可權。
三、模板方法模式的應用
1. 優點
封裝不變部分,擴充套件可變部分
把認為不變部分的演算法封閉到父類實現,而可變部分的則可以通過繼承來繼續擴充套件。
提取公共部分**,便於維護
把公共**
封閉到父類實現
行為由父類控制,子類實現
2. 缺點
抽象類一般只用於寫抽象方法,而該模式的抽象方法中有部分實現方法,另一部分抽象方法由子類實現,子類的結果影響父類,在複雜的專案中會帶來**閱讀的難度。
3. 使用場景
多個子類有公有的方法,並且邏輯基本相同時。
重要、複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細節功能則由各個子類實現。
重構時,模板方法模式是乙個經常使用的模式,把相同的**抽取到父類中,然後通過鉤子函式(見擴充套件)約束其行為
四、 模板方法模式的擴充套件
1、 擴充套件後的抽象模板類
public abstract class hummermodel
this.stop();
} //鉤子方法,預設喇叭是會響的
protected boolean isalarm()
}
2、 擴充套件後的h1悍馬
public class hummerh1model extends hummermodel
public void stop()
public void alarm()
public void engineboom()
protected boolean isalarm()
//要不要喇叭由使用者來決定。
public void setalarm(boolean isalarm)
}
3、擴充套件後的h2悍馬
public class hummerh2model extends hummermodel
public void stop()
public void alarm()
public void engineboom()
//預設沒有喇叭的
protected boolean isalarm()
}
4、場景類
public class client
h1.run();
system.out.println("--------------h2型號-----------------");
hummermodel h2 = new hummerh2model();
h2.run();
}}
擴充套件後h1型號的悍馬由客戶自己控制,也就是說外界條件改變,影響到模板方法的執行。在我們的抽象類中isalarm的返回值就是影響了模板方法的執行結果,該方法叫「鉤子方法」。run()方法可以按照規定的順序執行,也可以由isalarm()方法的返回值影響run()中的執行順序。
五、最佳實踐
父類如何呼叫子類方法?1. 反射
2. 呼叫靜態方法
3. 子類重寫父類方法後,呼叫父類方法就相當於呼叫子類方法
24種設計模式學習筆記之模板方法模式
模板方法模式 行為型設計模式 定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。模板方法模式 template method pattern 實際上是封裝了乙個固定流程,該流程由幾個步驟組成,具體步驟可以由子類進行不同實現,從...
23種設計模式 模板方法模式
參考文件 通常叫模板方法模式定義乙個演算法的骨架,並允許子類為乙個或者多個步驟提供實現。能夠使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。屬於行為性設計模式 一次性實現乙個演算法的不變的部分,並將可變的部分交給子類來實現 各子類中公共的行為被提取出來並集中到乙個公共的父類當中,從...
24種設計模式
那我們總結一下模板方法模式 模板方法模式就是在模板方法中按照乙個的規則和順序呼叫基本方法,具體到我們上面那個例子就是run方法按照規定的順序 先呼叫start,然後再呼叫engineboom,再呼叫alarm,最後呼叫stop 呼叫本類的其他方法,並且由isalarm方法的返回值確定run中的執行順...