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

C++ 設計模式:策略模式完整解析與工廠結合實作

     編輯:關於C語言

策略模式定義一系列演算法,將各演算法封裝並使其可互換,讓演算法能獨立於使用它的客戶端而變化。本文結合加班費計算實例,詳解策略模式結構、適用場景、基礎實作與簡單工廠結合優化。

核心概念

  • Strategy(抽象策略):定義所有演算法的公共介面。
  • ConcreteStrategy(具體策略):實作具體演算法(如平日加班、週末加班、國定假日加班)。
  • Context(環境角色):持有策略物件參考,委派實際計算工作。

UML 類別圖

策略模式 UML

適用場景

  1. 多個相關類別僅行為不同,需動態切換行為。
  2. 需要同一演算法的不同變體(如不同稅率計算)。
  3. 演算法使用客戶端不應知曉的資料,避免暴露複雜資料結構。
  4. 類別中包含大量條件分支,可將各分支移入獨立策略類別。

基礎實作(純策略模式)

#include <iostream>
using namespace std;

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

class ConcreteStrategyA : public Strategy {
public:
    void AlgorithmInterface() override { cout << "I am from ConcreteStrategyA." << endl; }
};

class ConcreteStrategyB : public Strategy {
public:
    void AlgorithmInterface() override { cout << "I am from ConcreteStrategyB." << endl; }
};

class ConcreteStrategyC : public Strategy {
public:
    void AlgorithmInterface() override { cout << "I am from ConcreteStrategyC." << endl; }
};

class Context {
    Strategy *pStrategy;
public:
    Context(Strategy *p) : pStrategy(p) {}
    void ContextInterface() { pStrategy->AlgorithmInterface(); }
    ~Context() { delete pStrategy; }
};

int main() {
    Context *pContextA = new Context(new ConcreteStrategyA);
    Context *pContextB = new Context(new ConcreteStrategyB);
    Context *pContextC = new Context(new ConcreteStrategyC);
    pContextA->ContextInterface();
    pContextB->ContextInterface();
    pContextC->ContextInterface();
    delete pContextA; delete pContextB; delete pContextC;
}

進階:策略模式 + 簡單工廠(降低客戶端複雜度)

#include <iostream>
using namespace std;

typedef enum { StrategyA, StrategyB, StrategyC } STRATEGYTYPE;

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

class ConcreteStrategyA : public Strategy {
public:
    void AlgorithmInterface() override { cout << "I am from ConcreteStrategyA." << endl; }
    ~ConcreteStrategyA() {}
};
// ConcreteStrategyB, ConcreteStrategyC 同理...

class Context {
    Strategy *pStrategy;
public:
    Context(STRATEGYTYPE type) {
        switch (type) {
            case StrategyA: pStrategy = new ConcreteStrategyA; break;
            case StrategyB: pStrategy = new ConcreteStrategyB; break;
            case StrategyC: pStrategy = new ConcreteStrategyC; break;
        }
    }
    ~Context() { delete pStrategy; }
    void ContextInterface() { if (pStrategy) pStrategy->AlgorithmInterface(); }
};

int main() {
    Context *pContext = new Context(StrategyA);
    pContext->ContextInterface();
    delete pContext;
}

實務應用啟示

資料庫連線是經典策略模式場景:不同資料庫(MySQL、PostgreSQL、Oracle)連線演算法不同,封裝為獨立策略,執行期動態切換,實現資料庫無關架構。

總結

策略模式將「做什麼」(Context)與「怎麼做」(Strategy)分離,符合開閉原則。結合簡單工廠可進一步簡化客戶端程式碼。實務中常見於演算法族群、格式轉換、驗證規則等可換拔邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved