首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

設計模式實作系列(十六):Strategy 策略模式 - 封裝演算法族實現執行期動態切換

     編輯:關於C++

模式意圖

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

核心解析:一句話總結

Strategy 模式就是「對演算法的封裝」。當解決同一問題有多種演算法(介面一致)時,提取共同介面為 Strategy,各演算法實作為 ConcreteStrategy,Context 持有策略指標並委派執行。

C++ 完整實作

1. Strategy.h

#ifndef STRATEGY_H
#define STRATEGY_H

class Strategy;
class Context {
public:
    Context(Strategy* pStrategy);
    ~Context();
    void ContextInterface();
private:
    Strategy* m_pStrategy;
};

class Strategy {
public:
    virtual ~Strategy() {}
    virtual void AlgorithmInterface() = 0;
};

class ConcreteStrategyA : public Strategy {
public:
    virtual ~ConcreteStrategyA() {}
    virtual void AlgorithmInterface();
};

#endif

2. Strategy.cpp

#include <iostream>
#include "Strategy.h"

Context::Context(Strategy* pStrategy) : m_pStrategy(pStrategy) {}
Context::~Context() { delete m_pStrategy; m_pStrategy = nullptr; }

void Context::ContextInterface() {
    if (m_pStrategy) m_pStrategy->AlgorithmInterface();
}

void ConcreteStrategyA::AlgorithmInterface() {
    std::cout << "AlgorithmInterface Implemented by ConcreteStrategyA\n";
}

3. Main.cpp

#include "Strategy.h"

int main() {
    Strategy* pStrategy = new ConcreteStrategyA();
    Context* pContext = new Context(pStrategy);
    pContext->ContextInterface();
    delete pContext;
    return 0;
}

擴充:多策略動態切換

實務上常在 Context 加入 SetStrategy(Strategy*),允許執行期替換:

void Context::SetStrategy(Strategy* pStrategy) {
    delete m_pStrategy;
    m_pStrategy = pStrategy;
}

// 使用範例
Context ctx(new ConcreteStrategyA());
ctx.ContextInterface(); // 執行 A
ctx.SetStrategy(new ConcreteStrategyB());
ctx.ContextInterface(); // 執行 B

現代 C++ 替代方案

  • std::function<ReturnType(Args...)> + Lambda:輕量、無需繼承體系。
  • 模板策略(靜態多態):template<typename Strategy> class Context,編譯期綁定,效能最高但無法執行期切換。

適用場景

  • 多種排序、壓縮、加密、路徑規劃演算法共存。
  • 業務規則頻繁變動(如促銷折扣計算、稅制計算)。
  • 需隱藏具體演算法實作細節(如第三方庫介面隔離)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved