1. 程式人生 > >模版方法模式(Template Method)

模版方法模式(Template Method)

1、概念

在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。

2、模式結構

  • 抽象類(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();
}