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