<commit_before>================================================================================
オブジェクト指向における再利用のためのデザインパターン改訂版 読書ノート 3/3
================================================================================

:doc:`gamma95-note2` からの続き。

:著者: <NAME>/<NAME>/<NAME>/<NAME>
:監訳者: 本位田真一 吉田和樹
:出版社: ソフトバンク クリエイティブ株式会社
:ISBN: ISBN4-7973-1112-6

.. contents:: ノート目次

第 5 章 振る舞いに関するパターン
======================================================================

Chain of Responsibility
----------------------------------------------------------------------
後回し。

Command
----------------------------------------------------------------------
後回し。

Interpreter
----------------------------------------------------------------------
真面目に読む気なし。

Iterator
----------------------------------------------------------------------
後回し。

Mediator
----------------------------------------------------------------------
後回し。

Memento<commit_msg>* source/gamma95-note3.rst: Chain of Responsibility パターンノート終了。<commit_after>================================================================================
オブジェクト指向における再利用のためのデザインパターン改訂版 読書ノート 3/3
================================================================================

:doc:`gamma95-note2` からの続き。

:著者: <NAME>/<NAME>/<NAME>/<NAME>
:監訳者: 本位田真一 吉田和樹
:出版社: ソフトバンク クリエイティブ株式会社
:ISBN: ISBN4-7973-1112-6

.. contents:: ノート目次

第 5 章 振る舞いに関するパターン
======================================================================

Chain of Responsibility
----------------------------------------------------------------------
複数オブジェクトに要求を処理する機会を与える。
要求の送信・受信オブジェクト間の結合を避け、オブジェクトをチェーンでつなぐ。

動機として、GUI アプリで状況依存ヘルプ機能について考察している。

* ヘルプ情報は <もっとも特殊なものからもっとも一般的なものへと組織化していく> (p. 237)

  印刷ボタン→印刷ダイアログ→アプリケーション、のような順にヘルプ優先度がある感じがわかる。

* <ヘルプ要求を出すオブジェクトをヘルプ情報を与えるオブジェクトから引き離す方法> (p. 237)
  が必要。
* <このパターンのポイントは、
  複数のオブジェクトに要求を処理する機会を与えることにより、
  要求を送信するオブジェクトと受信するオブジェクトを引き離すことにある> (p. 237)
* <チェーンの中にある各オブジェクトは、
  要求を処理したり後続のオブジェクト (successor) にアクセスするための
  共通のインタフェースを持っている> (p. 238)
* ヘルプの要求を処理したいクラスは、HelpHandler を親クラスにする (p. 238)

結果

* 結合度を低くする。
* 責任分散を柔軟にする。
* 要求が受信されるかどうかは保証されない。

実装

* チェーンの実装

  * オブジェクト間に既存の参照関係があれば、
    それを流用して successor チェーンとすることもあり。

* チェーンの接続

  * Handler クラスでは、通常は successor も保持する。
    要求を successor に転送することを実装のデフォルトとする。

* 要求の表現

  * 要求を Request オブジェクトとしてカプセル化して
    ``HandleRequest`` に渡すのが普通。

  * <サブクラスは自らが関与すべき要求のみを扱う。
    他の要求は転送する> (p. 242)

サンプルコードではさっきのヘルプの実装を検討している。

* <既存のウィジェット階層での親オブジェクトへの参照を利用する> (p. 243)
  ことで、ヘルプ要求を伝えていく方法をとる。

* 「チェーンの最初」といったら、
  一番最初に要求を処理するチャンスのあるオブジェクトを指すようだ。

* <ただし、successor は ``Widget`` オブジェクトではなく、
  任意の ``HelpHandler`` オブジェクトである> (p. 245)

使用例

* <ユーザのイベントを処理するために Chain of Responsibility パターンが使われている> (p. 246)
* <ユーザがマウスをクリックしたりキーを押したりすると、
  イベントが生成され、チェーンに沿って伝えられていくことになる> (p. 246)

関連するパターン

* <しばしば Composite パターンとともに適用される。
  その場合、component の親オブジェクトを successor にすることができる> (p. 247)

  子（持たれている方）が先に要求を処理するチャンスがあって、
  無視するならば親（所有者）に転送、か。

Command
----------------------------------------------------------------------
後回し。

Interpreter
----------------------------------------------------------------------
真面目に読む気なし。

Iterator
----------------------------------------------------------------------
後回し。

Mediator
----------------------------------------------------------------------
後回し。

Memento
{'fraction_non_alphanumeric': 0.41894353369763204, 'fraction_numerical': 0.020643594414086218, 'mean_word_length': 2.1866537717601546, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4789961', 'n_tokens_mistral': 1797, 'n_tokens_neox': 1689, 'n_words': 170}