設計模式之禪學習筆記10--模板方法模式
阿新 • • 發佈:2018-12-07
1.模板方法模式
定義一個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟.
類圖:
它的方法分為兩類:
● 基本方法
基本方法也叫做基本操作,是由子類實現的方法,並且在模板方法被呼叫。
● 模板方法
可以有一個或幾個,一般是一個具體方法,也就是一個框架,實現對基本方法的排程,
完成固定的邏輯。
子類重寫抽象類方法,再呼叫父類的方法實現效果
2.舉個例子:
建立一個抽象類AbstractClass:
package com.wx.templatemethodpattern.base; public abstract class AbstractClass { //基本方法 protected abstract void doSomething(); //基本方法 protected abstract void doAnything(); /* 模板方法 */ public void templatemethod() { //呼叫基本方法完成業務邏輯 this.doSomething(); this.doAnything(); } }
實現抽象類的方法:
package com.wx.templatemethodpattern.imp; import com.wx.templatemethodpattern.base.AbstractClass; public class ConcreteClass1 extends AbstractClass { @Override protected void doSomething() { System.out.println("ConcreteClass1"); } @Override protected void doAnything() { System.out.println("ConcreteClass1"); } } package com.wx.templatemethodpattern.imp; import com.wx.templatemethodpattern.base.AbstractClass; public class ConcreteClass2 extends AbstractClass { @Override protected void doSomething() { System.out.println("ConcreteClass2"); } @Override protected void doAnything() { System.out.println("ConcreteClass2"); } }
測試:
package com.wx.templatemethodpattern.test;
import com.wx.templatemethodpattern.imp.ConcreteClass1;
import com.wx.templatemethodpattern.imp.ConcreteClass2;
public class Client {
public static void main(String[] args)
{
ConcreteClass1 class1=new ConcreteClass1();
ConcreteClass2 class2=new ConcreteClass2();
//將抽象類的方式設定為protected是符合迪米特法則,
class1.templatemethod();
class2.templatemethod();
}
}
模板方法模式的優點:
封裝不變部分,擴充套件可變部分
提取公共部分程式碼,便於維護
行為由父類控制,子類實現
模板方法模式的缺點:
子類執行的結果影響了父類的結果,也就是子類對父類產生了影響,這在複雜的專案中,會帶來程式碼閱讀的難度,而且也會讓新手產生不適感
父類怎麼呼叫子類的方法:
● 把子類傳遞到父類的有參構造中,然後呼叫。
● 使用反射的方式呼叫,你使用了反射還有誰不能呼叫的?!
● 父類呼叫子類的靜態方法
專案中允許使用不?不允許!如果一定要呼叫子類,那為什麼要繼承它呢?搞不懂。其實這個問題可以換個角度去理解,父類建立框架,子類在重寫了父類部分的方法後,再呼叫從父類繼承的方法,產生不同的結果(而這正是模板方法模式)。這是不是也可以理解為父類呼叫了子類的方法呢?你修改了子類,影響了父類行為的結果,曲線救國的方式實現了父類依賴子類的場景,模板方法模式就是這種效果。
在軟體開發過程中,如果相同的一段程式碼複製過兩次,就需要對設計產生懷疑,架構師要明確地說明為什麼相同的邏輯要出現兩次或更多次。