メソッドを呼ぶということ自体をクラスにしてしまう。
あるクラスの処理を実行するにはクラスのメソッドを呼ぶ。その呼ぶということ自体をクラスで表現してしまうのがこのCommandパターン。あるクラスへの要求自体をクラスにしてしまえば、そのインスタンスを集めれば履歴として利用できる。クラスの種類を増やすことによって異なった要求にも対応できる。
CommandはEventと呼ばれることもある。GUIのアプリケーションを作成するときにでてくるイベントと同じ。
ゲームではAIの思考ルーチンをCommandで実装すると良いかもしれない。基本的で単純な行動、たとえば歩く、撃つ、防御するなどをコマンドとして実装し、それらを組み合わせて複雑な行動を実現する。そのコマンドを組み合わせる部分のインタフェースを実装すればユーザーが独自でAIを作り上げることも出来る。
// コマンドのインタフェース public interface Command { public abstract void execute(); }
// 歩くコマンド public class WalkCommand implements Command { public void execute() { // キャラを歩かせる処理 } }
// 撃つコマンド public class ShotCommand implements Command { public void execute() { // 撃つ処理 } }
// キャラクター public class Character { private Vector command; // コマンドのリスト // コマンドを追加 public addCommand(Command cmd) { cmd.add(cmd); } // 行動開始 public start() { Iterator it = commmand.iterator(); while(it.hasNext()) { Command cmd = (Command)it.next(); cmd.execute(); } } }
// テスト void doText { Character chara = new Character(); // コマンドを登録 chara.addCommand( new WalkCommand() ); // 歩いて chara.addCommand( new ShotCommand() ); // 撃つ // 行動開始 chara.start(); }
※ソースはイメージを表したもので、実際にはこのまま入力しても動作しない。
Commandクラスにパラメータのメンバーを持たせても面白いだろう。ただ歩く、だけでなく何歩歩くとか。まあ、実際にはAIがこんな簡単に実装できるものではないけど、イメージとしてはこんな感じ。