標籤:
適用情境 在某些類的演算法中,用了相同的方法,造成代碼的重複。 控制子類擴充,子類必須遵守演算法規則。 缺點 每個不同的實現都需要定義一個子類,這會導致類的個數的增加,設計更加抽象。 優點 模板方法模式通過把不變的行為搬移到超類,去除了子類中的重複代碼。 子類實現演算法的某些細節,有助於演算法的擴充。 通過一個父類調用子類實現的操作,通過子類擴充增加新的行為,符合“開放-封閉原則”。
模式中的角色 抽象類別(AbstractClass):實現了模板方法,定義了演算法的骨架。 具體類(ConcreteClass):實現抽象類別中的抽象方法,已完成完整的演算法。 應用 舉個例子,以準備去學校所要做的工作(prepareGotoSchool)為例,假設需要分三步:穿衣服(dressUp),吃早飯(eatBreakfast),帶上東西(takeThings)。學生和老師要做得具體事情肯定有所區別。 抽象類別AbstractClass
- public abstract class AbstractPerson{
- //抽象類別定義整個流程骨架
- public void prepareGotoSchool(){
- dressUp();
- eatBreakfast();
- takeThings();
- }
- //以下是不同子類根據自身特性完成的具體步驟
- protected abstract void dressUp();
- protected abstract void eatBreakfast();
- protected abstract void takeThings();
- }
複製代碼具體類ConcreteClass
- public class Student extends AbstractPerson{
- @Override
- protected void dressUp() {
- System.out.println(“穿校服");
- }
- @Override
- protected void eatBreakfast() {
- System.out.println(“吃媽媽做好的早飯");
- }
-
- @Override
- protected void takeThings() {
- System.out.println(“背書包,帶上家庭作業和紅領巾");
- }
- }
複製代碼
- public class Teacher extends AbstractPerson{
- @Override
- protected void dressUp() {
- System.out.println(“穿工作服");
- }
- @Override
- protected void eatBreakfast() {
- System.out.println(“做早飯,照顧孩子吃早飯");
- }
-
- @Override
- protected void takeThings() {
- System.out.println(“帶上昨晚準備的考卷");
- }
- }
複製代碼
- public class Client {
- public static void main(String[] args) {
- Student student = new Student()
- student.prepareGotoSchool();
-
- Teacher teacher = new Teacher()
- teacher.prepareGotoSchool();
- }
- }
複製代碼模板方法模式是類的行為模式。準備一個抽象類別,將部分邏輯以具體方法以及具體建構函式的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。 比如定義一個操作中的演算法的骨架,將步驟延遲到子類中。模板方法使得子類能夠不去改變一個演算法的結構即可重定義演算法的某些特定步驟。 |
更多 java學習,java資料,java經驗分享 http://techfoxbbs.com
java 的模板方式設計模式