ようこそ。睡眠不足なプログラマのチラ裏です。

デザインパターン第3回「Chain of Responsibilityパターン」


今回はGoFデザインパターンの中から
「Chain of Responsibilityパターン」をぬるーく解説します。

■Chain of Responsibilityパターンの概要■
Chain of Responsibilityは、直訳すると「責任の鎖」です。
つまり、伝言ゲームのように責任(要求)を委譲し、
責任(要求)を果たしてくれるまで、次々と責任(要求)を委譲していくパターンです。


このパターンは、要求をした送信オブジェクトが
要求を果たしてくれた受信オブジェクトを意識しないため、
送信オブジェクトと受信オブジェクトの結合を避けることができます。
このようなとき、「要求は暗黙の受信オブジェクトを持つ」といいます。


このChain of Responsibilityパターンは、
質問者が、質問に答えられる人に責任を負わせ(質問をたらいまわしにして)、
誰が答えてくれたかはわからないけど、結果的に質問者が質問の回答を得るというパターンです。


例えば、白ヤギさんが青ヤギさんに手紙で質問をしました。
青ヤギさんは答えがわかったので、すぐさまお返事を書きました。
その返事を受け取ると、白ヤギさんは再び青ヤギさんに別の質問の手紙を書きました。
青ヤギさんでは、次の質問には答えられなかったので、黒ヤギさんに聞いてみました。
数日後、白ヤギさんに青ヤギさんから回答の手紙が届きました。
白ヤギさんは物知りの青ヤギさんにとても感謝をしました。
後日、青ヤギさんが「助かったよ。おかげで白ヤギさんに返事ができたよ」と黒ヤギさんにお礼を言ったところ、
黒ヤギさんはこう言いました。「答えがわからなかったら、青ヤギさんからの手紙食べてただろうね」。


青ヤギ「Σ(゚Д゚`)ガーン!!!」

このパターンのポイントは、白ヤギさんは質問をたらいまわしにされた事実を知らないということ。
白ヤギさんは、いずれの質問も青ヤギさんが答えてくれたものだと思い込んでいます
(実際のところ、誰が質問に答えてくれたのかを知らない)。
2つめの質問は、青ヤギさんは答えを知らなかったけど、黒ヤギさんが知っていたいので、
白ヤギさんは答えを知ることができた。という事です。


「責任を持つものが、自分で判断できるものに関しては自分で判断をして応答し、
自分で判断できないものに関しては、次の責任者に判断を委ねる」という仕組みです。
Chain of Responsibility パターンは、このような「責任」の「鎖」をプログラムで表現するパターンです。



Chain of Responsibility パターンを利用するには、「一般的な責任者を表すクラス」を作成し、
それを継承する形で、白ヤギさん、黒ヤギさん、青ヤギさんなどのクラスを作成します。
「一般的な責任者を表すクラス」は、「判断」するメソッドと、自分で判断できなかった場合に、
その判断を仰ぐ、「次の責任者」を表すメンバ変数を持ちます(ポリモーフィズムを利用)。
各責任者を表すクラスは、この「一般的な責任者を表すクラス」を継承して作成します。


オマケ
Chain of Responsibilityパターン - VB.NET - 雑なサンプルソース