GoF本 Discussion of Behavioral Patterns
変化するものをカプセル化する
- ここでは「カプセル化する」 = 「同じインターフェースを与えて抽象化する」くらいの意味合い
- 「同じインターフェースを与える」ための新しいクラス・オブジェクトを導入する
- Chain of Responsibilityのように、既存のクラス・オブジェクトで済ますこともある
- 元々あったオブジェクト自身は仕事をせず、処理を委譲するようになる
- オブジェクト間の相互作用は必ずしも静的にはきまらない
- Chain of Responsibilityでは、リクエスト受信候補オブジェクトは動的にいくらでも増やせる
引数としてのオブジェクト
一元管理か分散か
- MediatorとObserverとは競合するパターン
- 珍しい
Mediator | Observer | |
---|---|---|
オブジェクト間の連絡 | 一元管理 | 分散 |
束縛条件 | Mediator一元管理 | ObserverとSubjectとで形成 |
再利用 | 大変 | 容易 |
処理の追いやすさ | 容易 | 大変 |
リクエストの送信/受信の疎結合化
- 密結合だとまずい
- 上位モジュールが下位モジュールを叩く、というレイヤー構造が台無しになる
- モジュール間に相互依存あると、単体で再利用できなくなる
- 以下、疎結合にするパターン。それぞれ特徴がある
- Command
- CommandのInvokerがsender
command->Execute()
の中でreceiver->Action()
する- 1 sender - 1 receiver
- Observer
- 出版-購読モデルともいうくらいで、基本的に 1 sender (Subject) - 多 receiver (Observer)
- 1つのObserverが複数のSubjectを観測することもある
- 状態の変化を通知
- データに依存関係がある場合に適している
- 【補】ModelとViewsとか
- 出版-購読モデルともいうくらいで、基本的に 1 sender (Subject) - 多 receiver (Observer)
- Mediator
- 多 sender - 多 receiver
- 各Colleagueがsenderでありreceiverである
- が、直接はやりとりせず、Mediatorを経由する
- やはり状態の変化を通知
- システムのカスタマイズが容易になる
- Mediatorだけ派生すればよいため
- Mediatorがsenderを引数に受け取って何かする場合、型安全性に注意
- 【補】引数型によるディスパッチができない場合、型フィールドによる分岐やダウンキャストを伴う
MediatorをVisitorに、ColleagueをElementにすれば回避可能
- 【補】引数型によるディスパッチができない場合、型フィールドによる分岐やダウンキャストを伴う
- Chain of Responsibility
- 1 sender - any receiver
- 新しいクラスやオブジェクトを追加する必要がない
- 実装によっては型安全性に注意
- 【補】引数型によるディスパッチができない場合、型フィールドによる分岐やダウンキャストを伴う
ResponseをCommandにすれば回避可能
- 【補】引数型によるディスパッチができない場合、型フィールドによる分岐やダウンキャストを伴う
- Command
併用
振る舞いのパターン同士
- Template Method
- あらゆるパターンと併用される
- Chain of ResponsibilityとCommand
- RequestをCommandにする
- InterpreterとState
- Contextに状態をもたせる?
- 【補】例) JavaScriptの構文解析で、strictモードかどうか
- Contextに状態をもたせる?
振る舞いのパターンと他の
- VisitorとComposite
- visit対象のオブジェクト構造がComposite
- Chain of ResponsibilityとComposite
- DecoratorとComposite
- 【補】例) お絵描きソフト
- 基本図形(Leaf)を組み合わせた複雑な図形(Composite)にマージンやボーダーをつける
- 【補】例) お絵描きソフト
- ObserverとComposite
- あるオブジェクト構造が変化したら、別のオブジェクト構造も追従させる
- StateとComposite
英語
- place A squarely B
- AをまっすぐBに向かわせる
- Bは副詞句 (in the mediator)
- オブジェクトの連絡の責務を全部Mediatorに押し付ける文脈で使用
- AをまっすぐBに向かわせる
- adverse
- 不利な
- nominally
- 名目上は
- 実際には抜け道がある感じ?
- subclassingをtemplateで回避できるよ、という文脈で使用
- 名目上は