策略模式和模板方法模式的異同

gongchengship發表於2024-07-09

策略模式(Strategy Pattern)和模板方法模式(Template Method Pattern)都是行為設計模式,用於定義演算法的結構和行為,但它們在實現方式和應用場景上有一些顯著的差異。以下是這兩種模式的對比:

策略模式 (Strategy Pattern)

定義

策略模式定義了一系列演算法,並將每個演算法封裝起來,使它們可以互換。策略模式使得演算法可以獨立於使用它的客戶端而變化。

組成部分

  1. 策略介面(Strategy Interface):定義演算法的通用介面。
  2. 具體策略類(Concrete Strategies):實現策略介面的具體演算法。
  3. 上下文類(Context):持有一個策略介面的引用,透過策略介面呼叫具體的演算法。

示例程式碼

// 策略介面
interface Strategy {
    void execute();
}

// 具體策略類
class ConcreteStrategyA implements Strategy {
    public void execute() {
        System.out.println("Strategy A");
    }
}

class ConcreteStrategyB implements Strategy {
    public void execute() {
        System.out.println("Strategy B");
    }
}

// 上下文類
class Context {
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.execute();
    }
}

應用場景

  • 需要在執行時選擇不同的演算法或行為。
  • 需要避免使用條件語句(如if-elseswitch-case)來選擇行為。
  • 需要能夠獨立於使用它的客戶端而變化的演算法。

模板方法模式 (Template Method Pattern)

定義

模板方法模式定義了一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

組成部分

  1. 抽象類(Abstract Class):定義演算法的骨架,幷包含一個或多個抽象方法(即未實現的方法),這些抽象方法將在子類中實現。
  2. 具體子類(Concrete Subclasses):實現抽象類中的抽象方法,以完成演算法中相應的步驟。

示例程式碼

// 抽象類
abstract class AbstractClass {
    // 模板方法,定義演算法骨架
    public final void templateMethod() {
        stepOne();
        stepTwo();
        stepThree();
    }

    // 具體步驟,由子類實現
    protected abstract void stepOne();
    protected abstract void stepTwo();
    protected abstract void stepThree();
}

// 具體子類
class ConcreteClassA extends AbstractClass {
    protected void stepOne() {
        System.out.println("ConcreteClassA: Step One");
    }
    protected void stepTwo() {
        System.out.println("ConcreteClassA: Step Two");
    }
    protected void stepThree() {
        System.out.println("ConcreteClassA: Step Three");
    }
}

class ConcreteClassB extends AbstractClass {
    protected void stepOne() {
        System.out.println("ConcreteClassB: Step One");
    }
    protected void stepTwo() {
        System.out.println("ConcreteClassB: Step Two");
    }
    protected void stepThree() {
        System.out.println("ConcreteClassB: Step Three");
    }
}

應用場景

  • 在多個類中共享程式碼,避免程式碼重複。
  • 需要在不改變演算法結構的情況下,重定義演算法中的某些步驟。
  • 需要控制子類的擴充套件,以確保演算法的框架結構不變。

主要區別

  1. 目的和用法

    • 策略模式:主要用於在執行時選擇不同的演算法或行為,且這些演算法是互換的。
    • 模板方法模式:主要用於定義一個演算法的骨架,並允許子類在不改變演算法結構的情況下重新定義某些步驟。
  2. 類關係

    • 策略模式:使用組合(組合多個策略類),策略由上下文類持有並呼叫。
    • 模板方法模式:使用繼承(模板方法在抽象類中定義),子類透過實現抽象方法來定製具體步驟。
  3. 設計目標

    • 策略模式:強調的是演算法的可互換性和獨立性。
    • 模板方法模式:強調的是演算法結構的穩定性和步驟的可變性。
  4. 靈活性

    • 策略模式:在執行時可以靈活地切換策略,適用於演算法在執行時需要動態變化的場景。
    • 模板方法模式:透過繼承來實現演算法步驟的變化,適用於演算法步驟在編譯時確定的場景。

總結

策略模式和模板方法模式雖然在某些方面有相似之處,但它們解決的問題和實現方式有明顯的不同。策略模式適用於需要在執行時選擇不同演算法的場景,而模板方法模式適用於需要在多個類中共享程式碼並允許子類重定義某些步驟的場景。瞭解它們的區別和應用場景,可以更好地選擇合適的設計模式來解決實際問題。

相關文章