##概要
オブジェクトの状態を観察するパターン
以下の4種類のクラスからなる
- Subjectクラス(2.を知っており、2.の追加や削除を行う)
- Observerクラス(1.の変化が通知された時のための更新のインターフェースを定義)
- ConcreteSubjectクラス(1.で定義したインタフェースを実装、状態が変わった時に4.に通知を送る)
- ConcreteObserverクラス(2.で定義したインタフェースを実装)
##具体例と実装
各家庭のSOS通知システムにすると、
上記1~4はそれぞれ
- 家庭クラス(Familyクラス、正常状態、緊急状態があり、どの通知センターに属すかを保持する)
- SOS監視センタークラス(SosObserverクラス、各家庭の状態を監視する)
- 山田さん一家クラス(YamadaFamilyクラス、家庭の状態に異常があった場合に、所属する監視センターに通知する)
- 地方自治体監視クラス(LocalSosObserverクラス、家庭からの通知を受け取り、対応部隊を出動させる)
が対応する。
コードの詳細は以下
family.rb
class Family
def initialize
@observers = []
end
def register(observer)
# 自身を監視センターに登録する
@observers << observer
end
def unregister(observer)
# 監視センターから自身を登録解除する
@observers.delete(observer)
end
def notify(state)
# 登録している通知センターに状態を通知する
@observers.each do |observer|
observer.update(state)
end
end
end
sos_observer.rb
class SosObserver
def update(state)
end
end
yamada_family.rb
class YamadaFamily < Family
end
local_sos_observer.rb
class LocalSosObserver
def update(state)
# stateに応じて、対応する部隊を出動させる
...
end
end
yamada_family = YamadaFamily.new
yamada_family.register(LocalSosObserver.new)
yamada_family.notify('トイレが詰まった')
##メリット
- SubjectとObserverを独立に変更することが出来る
##まとめ
分散イベント処理システムの実装の際に便利なパターン