Chain of Responsibility を Go で
Chain of Responsibility は、 振る舞いに関するデザインパターンの一つで、 潜在的なハンドラーの連鎖の上を、 ハンドラーのどれかが処理するまで、 リクエストを回していきます。
このパターンを利用すると、 送り手のクラスと受け手の具象クラスとを結合することなく、 複数のオブジェクトにリクエストを処理する機会を与えることができます。 連鎖は実行時に、 標準のハンドラー・インターフェースに従うハンドラーから動的に構成されます。
概念的な例
Chain of Responsibility パターンを、 病院アプリを例に見ていきましょう。 病院には以下のような複数の場所や役割があります:
病人が到着すると、 まず受付に行き、 医者に会い、 薬局に行き、 そして支払い窓口などへ行きます。 患者は、 部局の連鎖の中を回され、 各部局はその機能を終えると、 患者を次の部局へ送ります。
このパターンは、 同一リクエストを処理する複数の候補がある時、 適用可能です。 リクエストを処理できる複数のオブジェクトがあり、 クライアントに受け手の選択をさせたくない場合も、 このパターンが役に立ちます。 もう一つの役に立つケースとしては、 クライアントを受け手から分離したい場合です。 クライアントは、 連鎖の最初の要素だけ知っておく必要があります。
病院の例のように、 患者は最初に受け付けに行きます。 その後、 患者の現在の状態に基づいて、 受け付けは連鎖内の次のハンドラーに送り出します。
department.go: ハンドラー・インターフェース
reception.go: 具象ハンドラー
doctor.go: 具象ハンドラー
medical.go: 具象ハンドラー
cashier.go: 具象ハンドラー
patient.go
main.go: クライアント・コード
output.txt: 実行結果