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

C++ 設計模式深度解析:策略模式與遊戲武器系統實戰

     編輯:C++ 入門

什麼是策略模式?

定義:定義一系列算法類,將每個算法封裝起來,使它們可以相互替換。策略模式讓算法的變化獨立於使用算法的客戶端,屬於對象行為型模式。

核心目的:將算法的定義與使用分離,即將行為(算法)與環境(上下文)解耦。環境類針對抽象策略編程,運行時動態注入具體策略。

模式結構三大角色

  1. Strategy(抽象策略):定義算法接口,如 virtual void Fight() = 0
  2. ConcreteStrategy(具體策略):實現具體算法,如 Gun, Ak47, Axe
  3. Context(環境類):持有策略引用,委派調用,如 Player 類

實戰案例:射擊遊戲武器系統

抽象武器類


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();

配合依賴注入框架、配置文件、插件系統,實現真正的「無需重新編譯即可擴展行為」。

總結

策略模式是「算法封裝 + 組合委派 + 介面導向」的教科書級應用。掌握其核心在於:識別出系統中易變的算法族,提取公共介面,將具體實現遷移到獨立類中,環境類持有介面引用並在運行時綁定。這不僅是設計模式,更是「面向變化編程」的核心思想體現。

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