デザインパターン → Chain of Responsibility パターン(責任の連鎖)

1. 意図

  • 「Chain of Responsibility」という英単語は、「責任の連鎖」を意味します。
  • このパターンは、ある要求の受取り対象となる複数のオブジェクトに鎖状の関係を構築し、要求を処理する事が可能なオブジェクトに渡るまで、順次、構築した鎖状の関係に沿って要求を受流していくパターンです。
  • 一つの処理パイプラインの中で、要求を残し、起動します。
  • このパターンでは、要求の受取り対象の中で、次の要求の受取り対象への参照国営百貨店が含まれます。 要求の受取り対象は要求を処理できない場合、メッセージにて次の要求の受取り対象に伝えます。
  • クラス図:

2. 例

  • 責任の連鎖はいろいろな運用がある。責任の連鎖の運用を分かりやすくなるように、ここで実際に例を挙げよう。この パターンはお金を引出す時の仕組みとしてATMで使われています。
  • 例えば、五万円を引出す時、ATMから一万円札4枚、五千円札1枚、千円札5枚が出てきた。ATMの中で、一万円札がまだ残っているのにどうして一万円札5枚が出てこなかった?)。少し考えてみよう。人が5万円以上の金額を引き出したらATMから全てが一万円札でお金が出てきた。次の人は五万円を引き出したいのに、一万円札がなくなってしまった為全部千円札をもらった。お金が十分かどうか確認する時大変だろう。

3. 問題

  • ハンドラの関係や優先順位、またはリクエストとハンドラのマッピングをハードワイヤリングすることなく、効率的にリクエストを処理する必要があります。
  • 例えば、二つ野要求を届く時、一つ目の要求は受取り対象を探さないかのうちに、二つ目の要求は受取り対象を探されました。でも、二つ目の要求を処理する時、一つ目の要求からの結果が必要です。

4. 議論

  • 未処理の要求を「キャッチ」するための「安全ネット」が存在することを確認してください。
  • それぞれの要求が一つハンドラによって処理される場合、または顧客は受信機のサービスを知っている場合は、「責任の連鎖」を使用しないでください。

5. 実施

  • 私たちは抽象クラスAbstractLoggerを作成しました。 次に、AbstractLoggerを拡張する三つ種類のロガーを作成しました。 各ロガーは、メッセージのレベルをそのレベルまでチェックし、それに応じて印刷します。それ以外の場合、メッセージは印刷されず、次のロガーに渡されます。
  • クラス図:
  • サンプルコード: https://www.tutorialspoint.com/design_pattern/chain_of_responsibility_pattern.htm

6. 参考にしたサイト

https://www.tutorialspoint.com/design_pattern/chain_of_responsibility_pattern.htm https://sourcemaking.com/design_patterns/chain_of_responsibility https://github.com/iluwatar/java-design-patterns/tree/master/chain http://www.itsenka.com/contents/development/designpattern/chain_of_responsibility.html


All Rights Reserved