Strategyパターンの書き方をざっくり説明

Strategyパターンとは

アルゴリズムの変化する部分をクラス化して交換できるようにするパターン
Strategy パターン - Wikipedia


実装方法

class cWeapon
{
public:
    cWeapon() {}
    ~cWeapon() {}
    virtual void Attack() = 0;
};
class cGun : public cWeapon
{
public:
    cGun() { std::cout << "主人公は銃を装備した" << std::endl; }
    ~cGun() {}
    virtual void Attack() { std::cout << "主人公は銃で攻撃!!" << std::endl; }
};
class cKnife : public cWeapon
{
public:
    cKnife() { std::cout << "主人公はナイフを装備した" << std::endl; }
    ~cKnife() {}
    virtual void Attack() { std::cout << "主人公はナイフで攻撃!!" << std::endl; }
};
class Player
{
    std::unique_ptr<cWeapon> weapon;
public:
    Player(cWeapon *pWeapon) { HandChange(pWeapon); }
    ~Player() {}
    void HandChange(cWeapon *pWeapon){ weapon.reset(pWeapon); }
    void Attack() { weapon->Attack(); }
};

Playerクラスのweaponは銃とナイフの二通りの処理をする必要があります。
そのため銃の挙動を行いたい場合はcGunクラスの処理を、ナイフの処理を行いたい場合はcKnifeクラスの処理を行います。

実行してみる

int main()
{
    std::unique_ptr<Player> player;
    player.reset(new Player(new cGun));
    player->Attack();
    player->HandChange(new cKnife);
    player->Attack();
   return 0;
}

実行結果

f:id:haina817:20180221004823p:plain

思ったこと

個人的には分岐が多かったり、switch文が乱用されるのを防ぐためによく使用するパターンです
武器の換装やAIの難易度分岐などなど
かなり便利ですが下手に使用するとファイル間の行き来が面倒なのでそこは気を付けないとですねー