デザインパターンを学ぶ 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アップを追加したときには? そのたびにそれが必要のないすべてのサブクラスでオーバーライドするのですか?
続く