クラスの要素と図のみかたをUmletinoでおぼえる
まずは継承(汎化)
javaだと継承に関する宣言子はAbstract /extendsなど
継承(汎化)が議論に出てこないデザインパターン
Singleton(継承しないので)、Facade(モジュール粒度が違うので)、Flyweight(どっちでもいいので)、Memento(粒度)
継承の根拠になるのは置換可能性という概念
汎化とちょっと違う実装(実現)線
JavaだとInterface/Implementsなど
実装(implementation)が脚光を浴びるデザインパターン
Prototype(しめしあわせがある) Adapter(委譲or継承)、Command(TBD)、State(状態だから)、Strategy(たぶん継承委譲)、そしてこのObserverパターン
Observerパターンの議論に入る前に、コンポジットと集約について少し
つないだ先AとBで、Aが消滅してもBが消滅しないのが集約、Aが消滅したらBも消滅するのが合成。 合成には多重度の記述がある。
集約系パターン
Builder(頭領が大工を集約)、Bridge(橋渡しを集約)、Composite(子供を集約)、Decorator(コンポーネントをデコレータが集約)、FlightWeight(FWファクトリがフライトウェイトを集約)、Interpreter(表現を集約)、Iterator()、State(状態たくさん)、Strategy(戦略いくつか)、
合成系パターン
GofのObserver 集約まで書いてなく、汎化(継承)で組み上がっている
イベント処理に関わる
ObserverオブジェクトがSubjectを観察することができる。
SubjectはObserverオブジェクトをアタッチしたりデタッチするためのインタフェースを提供する。
Observerは観察できるようにする代わりに、Subjectに更新情報を与える
Subject(観察対象)=Observable(観察できるよ)という言い方もある
Listener=Observerかは、文脈によるようだ
Mediator & Observer
おまけ)デザインパターンの宗祖はChristopher AlexanderにあるとKhalidが言い出した。
道路の建築についての話がデザインパターンの話となる。
それを拾った奇人が80年代に登場したと言うことらしい
90年代、GoFとデザインパターンが登場
パターンを適用することで抽象度が上がっていく
話はSmalltalk-80のMVCに行く。つまり「デザインパターン」の議論とは、当初イベントやらVIewやらのUIの制御を前提としているということがわかる。上記をふまえて、Observerパターンをもいちど見る。
MVC の Model クラスは Subject の役割を果たし、View はオブザーバの基底クラスです。
関連するパターンとしてMediatorとSingletonが挙げられている。Mediatorは文字通り仲介者として、Singletonは観察するクラスが一意性を持つためにそれぞれ関連がある。
コールバックを使うよりもオブザーバーにした方がネストが浅くなる
数式で見るオブザーバーパターン
オブザーバーパターンは、あるオブジェクト(サブジェクト)の状態が変化したときに、依存する他のオブジェクト(オブザーバー)に自動的に通知され、更新されるようにするパターンです。これは以下のような関数で表せます。
O=f(S)
ここで、Sはサブジェクトの状態、Oはオブザーバーの集合、fはサブジェクトの状態変化に応じてオブザーバーを更新する関数です。