定義:定義一系列算法類,將每個算法封裝起來,使它們可以相互替換。策略模式讓算法的變化獨立於使用算法的客戶端,屬於對象行為型模式。
核心目的:將算法的定義與使用分離,即將行為(算法)與環境(上下文)解耦。環境類針對抽象策略編程,運行時動態注入具體策略。
virtual void Fight() = 0Gun, Ak47, AxePlayer 類
class Weapon {
public:
virtual void Fight(const string& player) = 0;
virtual ~Weapon() = default;
};
class Gun : public Weapon {
public:
void Fight(const string& player) override {
cout << "玩家 " << player << " 使用手槍,殺傷力 8 級\n";
}
};
class Ak47 : public Weapon {
public:
void Fight(const string& player) override {
cout << "玩家 " << player << " 使用 AK47,殺傷力 10 級\n";
}
};
class Axe : public Weapon {
public:
void Fight(const string& player) override {
cout << "玩家 " << player << " 使用斧頭,殺傷力 6 級\n";
}
};
class Player {
string name;
Weapon* weapon; // 組合關係,非繼承
public:
void SetName(const string& n) { name = n; }
void SetWeapon(Weapon* w) { weapon = w; }
void Fight() { if (weapon) weapon->Fight(name); }
};
int main() {
Player* p = new Player(); p->SetName("挑戰者");
Weapon* ak = new Ak47();
p->SetWeapon(ak); p->Fight(); // 輸出:玩家 挑戰者 使用 AK47,殺傷力 10 級
// 動態切換策略
p->SetWeapon(new Gun()); p->Fight(); // 切換手槍
delete p; delete ak;
return 0;
}
if-else / switch 硬編碼,算法邏輯分散在各策略類中| 場景 | 策略對應 | 環境類 |
|---|---|---|
| 電影院票價 | 成人票、學生票、VIP票折扣算法 | 售票系統 |
| 數據導出 | 導出 Excel、CSV、JSON、DB | 導出管理器 |
| 支付方式 | 支付寶、微信、銀聯、貨到付款 | 訂單結算 |
| 加密算法 | AES、RSA、DES、國密 SM4 | 加密工具類 |
| 排序算法 | 快排、歸併、堆排、計數排序 | 排序工具類 |
| UI 佈局 | 線性、相對、網格、約束佈局 | 容器管理器 |
// 策略工廠
class WeaponFactory {
public:
static unique_ptr Create(const string& type) {
if (type == "gun") return make_unique();
if (type == "ak47") return make_unique();
if (type == "axe") return make_unique();
throw invalid_argument("Unknown weapon");
}
};
// 客戶端無需知道具體類
Player p; p.SetName("Player");
p.SetWeapon(WeaponFactory::Create(config["weapon"]).release());
p.Fight();
配合依賴注入框架、配置文件、插件系統,實現真正的「無需重新編譯即可擴展行為」。
策略模式是「算法封裝 + 組合委派 + 介面導向」的教科書級應用。掌握其核心在於:識別出系統中易變的算法族,提取公共介面,將具體實現遷移到獨立類中,環境類持有介面引用並在運行時綁定。這不僅是設計模式,更是「面向變化編程」的核心思想體現。