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

#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)分離,符合開閉原則。結合簡單工廠可進一步簡化客戶端程式碼。實務中常見於演算法族群、格式轉換、驗證規則等可換拔邏輯。