如果你要实现以下功能:
一个卡牌类,有不同的效果,很自然地可以想到以下实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class BaseCard { protected: std::string name; std::string description; size_t id; dword cost;
public: void onHandTurnStart(); void onTurnStart(); void onUse(); void onHandTurnEnd(); void onTurnEnd(); dword onAttacked(); void afterAttacked(); dword onAttack(); void afterAttack();
};
class myCard : public BaseCard{ void onUse(){ player.heal(10); } }
|
1 2 3 4 5 6 7 8 9
| class player{ public: void useCard(BaseCard& card){ card.onUse(); } void TurnStart(BaseCard& card){ card.onTurnStart(); } }
|
但是这样,如果要创造更多的不一样的卡牌,就要一直添加Card,同时,如果考虑人物技能,道具能力,也许一个效果要重写多次,所以,完全可以将效果单独拿出来当作新类,然后在对应人物/道具/卡牌中添加不同的效果模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Effect { public: virtual void onTurnStart() {}; virtual void onUse() {}; virtual ~Effect() = default; };
class AEffect : public Effect { public: void onUse(){ player.heal(10); } }; class CaposEffect : public Effect{ private: std::vector<std::shared_ptr<Effect>> ce; public: void onUse(){ for(auto effect:ce){ effect->onUse(); } } void addEffect(std::shared_ptr<Effect>&x){ ce.push_back(x); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class BaseCard { protected: std::string name; std::string description; size_t id; dword cost; std::shared_ptr<CaposEffect> effects; public: virtual void onHandTurnStart(){ effects->onHandTurnStart(); }; virtual void onUse(){ effects->onUse(); }; void addEffect(std::shared_ptr<Effect>&x){ effects.addEffect(x); } };
class myCard : public BaseCard{ void onUse(){ player.heal(10); } }
|
这样实现了两种对象之间的解耦,且可以为effect创建effect组,实现多种效果的组合。