模版方法模式(Template Method)
阿新 • • 發佈:2018-11-19
1、概念
在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。
- 抽象類(AbstractClass): 定義一組基本方法供子類實現,定義並實現組合了基本方法的模板方法
- 具體子類 (ConcreteClass): 實現原語操作以完成演算法中與特定子類相關的步驟。
3、使用場景
- 當不變的和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重複出現
- 重要、複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細節功能由各個子類實現
- 控制子類擴充套件;模板方法只在特定點呼叫“ hook”操作 ,這樣就只允許在這些點進行擴充套件
4、優缺點
優點:
- 封裝不變部分,擴充套件可變部分
- 一種程式碼複用的基本技術。它們在類庫中尤為重要,它們提取了類庫中的公共行為,便於維護
- 有框架控制如何做事情,而由使用框架的人指定框架演算法中每個步驟的細節,實現控制反轉原則
缺點:
- 每個不同的實現都需要定義一個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象
5、例項
首先定義開門的的抽象類,openDoor為開門的公用方法,但開鎖有多種方式,setNeedUnLock為鉤子方法,可由子類控制是否需要開鎖
public abstract class AbsUnlock { private boolean isNeedUnlock = true; protected abstract void unlockAction(); public void setNeedUnlock(boolean needUnlock) { isNeedUnlock = needUnlock; } public final void openDoor() { if (isNeedUnlock) { unlockAction(); } // 其它處理邏輯 } }
磁卡開鎖類
public class CardUnlock extends AbsUnlock {
@Override
protected void unlockAction() {
// 磁卡開鎖邏輯
}
}
密碼開鎖類
public class PasswordUnlock extends AbsUnlock {
@Override
protected void unlockAction() {
// 密碼開鎖邏輯
}
}
客戶端呼叫
public static void main(String[] args) {
CardUnlock card = new CardUnlock();
card.openDoor();
PasswordUnlock pwd = new PasswordUnlock();
pwd.openDoor();
}