デザインパターンを学ぶ Strategy パターン偏その1

ゲームを作ろう

私はとあるゲームの開発を行っています。 このゲームは多種多様なキャラクターを操作することができます。 そこで全てのキャラクターが継承するChampionスーパークラスを作成しました。

//Champion.java
public class Champion {
  public void attack(){
    System.out.println("attack");
  }
  public void move(){
    System.out.println("move");
  }
  public void display();
}

全てのキャラクターは攻撃と移動が可能で、キャラクター毎に違う見た目を持っています。

//Ez.java
ublic class Ez {
  public void display(){
    System.out.println("Ezの表示");
  }
}

//Toris.java
ublic class Toris {
  public void display(){
    System.out.println("Torisの表示");
  }
}

うん、完璧な実装ですね。





しかし、仕様が変わってしまった

私の上司はこのゲームにブリンクが必要だと判断しました。 ブリンクのスタイリッシュな動きがこのゲームを素晴らしいものにするのです。

私は必要なのはChampionクラスにsay()メソッドを追加することだと判断しました。 そうすれば全てのキャラクターがブリンクをつかえるようになります。 さあ、実装しましょう。

//Champion.java
public class Champion {
  public void attack(){
    System.out.println("attack");
  }
  public void move(){
    System.out.println("move");
  }
  public void display();
  public void blink() {
    System.out.println("blink");
  }
}





だがしかし

私は気づいていませんでした。 全てのキャラクターがブリンクできるべきではないということに。

ブリンクを持ったコグマウがサマナーズリフトを駆け回っています。 Championスーパークラスに新しいふるまいを追加した際に、いくつかのChampionサブクラスには適切でないふるまいを追加してしまったのです。





display()メソッドと同様に、ブリンクできないキャラクターで常にblink()メソッドをオーバーライドすることもできます……

しかし、そうすると他のメソッドを追加した際はどうなるのでしょう?

例えば、MSアップを追加したときには? そのたびにそれが必要のないすべてのサブクラスでオーバーライドするのですか?





続く