LoginSignup
1
1

More than 5 years have passed since last update.

【デザインパターン】 Observerパターン

Posted at

概要

オブジェクトの状態を観察するパターン

以下の4種類のクラスからなる
1. Subjectクラス(2.を知っており、2.の追加や削除を行う)
2. Observerクラス(1.の変化が通知された時のための更新のインターフェースを定義)
3. ConcreteSubjectクラス(1.で定義したインタフェースを実装、状態が変わった時に4.に通知を送る)
4. ConcreteObserverクラス(2.で定義したインタフェースを実装)

具体例と実装

各家庭のSOS通知システムにすると、

上記1~4はそれぞれ

  1. 家庭クラス(Familyクラス、正常状態、緊急状態があり、どの通知センターに属すかを保持する)
  2. SOS監視センタークラス(SosObserverクラス、各家庭の状態を監視する)
  3. 山田さん一家クラス(YamadaFamilyクラス、家庭の状態に異常があった場合に、所属する監視センターに通知する)
  4. 地方自治体監視クラス(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を独立に変更することが出来る

まとめ

分散イベント処理システムの実装の際に便利なパターン

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1