ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

Chain of Responsibility

直訳すれば「責任の鎖」。受け取った処理が自分で解決できるなら解決し、解決できない場合は次へ回すという、行ってみればたらい回し。
とある処理を解決する方法が何種類かある場合、処理をリストでつなげておけば、どの処理を使うのか使う側が選択せずに、リストの先頭に任せてしまえばよい。これで使う側がどんな処理があるのかなど詳しく知らなくても済む。

public abstract class Handler {
    private Handler next;
    // 次に回すHandlerを設定するメソッド
    public Handler setNext(Handler next) {
        this.next = next;
        return next;
    }
    // 処理を受け取るメソッド
    public final void request(Param param) {
        if (exec(param)) {
            // 処理できた
        } else if (next != null) {
            next.request(param);
        } else {
            // 処理できなかった
        }
    }
    // 実際に処理するメソッド
    // 解決できたらtrue、解決できなかったらfalseを返す
    protected abstract boolean exec(Param param);
}

void doTest() {
    Handler0 h0 = new Handler0();
    Handler1 h1 = new Handler1();
    Handler0 h2 = new Handler2();
    // リンクを作成
    h0.setNext(h1).setNext(h2);
    // 先頭にリクエスト
    h0.request(param);
}

※ソースはイメージを表したもので、実際にはこのまま入力しても動作しない。
このHandlerを継承して実際に処理するクラスを作成する。それらのクラスをリンクでつなぎ、その先頭にrequestを出せばよい。
さて、ゲームでどう使うかと考えてみたが、なかなかいい例が思いつかない。リンクでたらい回しするということはどうしても処理が遅くなってしまうため、速度が重要となるゲームではあんまり有効ではないのかもしれない。


参考文献:Java言語で学ぶデザインパターン入門
参考:ギコ猫とChain of Responsibilityパターン