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

設計模式筆記:策略模式 C++ 實現詳解

     編輯:關於C語言

什麼是策略模式

《大話設計模式》定義:策略模式定義了一系列算法,將每個算法封裝起來,使它們可以相互替換。讓算法的變化不會影響到使用算法的客戶。

UML 結構

  • Context:持有 Strategy 引用,委託具體算法執行;
  • Strategy:算法族的公共介面(純虛類);
  • ConcreteStrategy:具體算法實現。

關係:Context 與 Strategy 為 聚合關係(弱擁有,生命週期獨立),區別於組合關係(強擁有,生命週期綁定)。

核心代碼框架

// 抽象策略
class Strategy {
public:
    virtual void AlgorithmInterface() = 0;
    virtual ~Strategy() {}
};

// 具體策略 A
class ConcreteStrategyA : public Strategy {
public:
    void AlgorithmInterface() override { cout << "算法 A" << endl; }
};

// 具體策略 B
class ConcreteStrategyB : public Strategy {
public:
    void AlgorithmInterface() override { cout << "算法 B" << endl; }
};

// 上下文
class Context {
    Strategy* strategy;
public:
    explicit Context(Strategy* s) : strategy(s) {}
    void ContextInterface() { strategy->AlgorithmInterface(); }
    ~Context() { delete strategy; } // 簡單演示,實際建議智能指針
};

客戶端使用

int main() {
    // 使用智能指針避免內存洩漏
    unique_ptr s1 = make_unique();
    unique_ptr c1 = make_unique(s1.release());
    c1->ContextInterface();

    unique_ptr s2 = make_unique();
    unique_ptr c2 = make_unique(s2.release());
    c2->ContextInterface();
    return 0;
}

實戰示例:遊戲角色攻擊策略

// 職業介面
class Character {
public:
    virtual void attack() = 0;
    virtual ~Character() {}
};

// 具體職業
class Saber : public Character {
public:
    void attack() override { cout << "斬擊" << endl; }
};
class Archer : public Character {
public:
    void attack() override { cout << "射擊" << endl; }
};
class Caster : public Character {
public:
    void attack() override { cout << "火球術" << endl; }
};

// 玩家上下文
class Player {
    Character* pChar;
public:
    explicit Player(Character* c) : pChar(c) {}
    void action() { pChar->attack(); }
    ~Player() { delete pChar; }
};

// 客戶端
int main() {
    unique_ptr player = make_unique(new Caster());
    cout << "魔法師攻擊:"; player->action();
    player = make_unique(new Saber());
    cout << "劍士攻擊:"; player->action();
    return 0;
}

模式優勢

  1. 開閉原則:新增職業只需新增 ConcreteStrategy,無需修改 Context;
  2. 避免條件分支:消除 `if-else` 或 `switch` 選擇算法;
  3. 算法復用:策略類可在不同 Context 中復用。

注意事項

  • 客戶端必須知道所有策略類以選擇合適的;
  • 策略類應輕量,避免頻繁創建銷毀開銷(可結合享元模式);
  • 現代 C++ 可用 `std::function` + Lambda 簡化輕量策略。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved