1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyのデザインパターン開発におけるobserverパターンの一例

2022-01-31 18:26:51

一般に、Observerパターンの定義は、「あるオブジェクトが変更されたというニュースの発信源と、そのニュースの消費者の間に、きれいなインタフェースを構築すること」のようなものだろう。

Observerパターンは、メッセージのproducerとconsumerの間の結合が抽象化されるように、きれいなインタフェースを確立します。observed は observer のどちらかを知ることはできませんが、両者が共通のインタフェースを実装していることだけは知っています。observerとobservedは緊密に結合していないので、異なる抽象レベルに属することができる。

observerパターンはブロードキャスト通信をサポートしており、observedは登録された各observerにブロードキャストで変更メッセージを送信します。このブロードキャストパターンは、オブザーバがループして通知される可能性があり、多くのリソースを消費してしまいます。

一般化したObserverパターンでは、定義すべき役割が2つある。

件名: メッセージを生成するクラスが件名です。前の例では、それはTesterクラスでした。

オブザーバー。subjectが生成したメッセージに興味を持つクラス。前の例では、税務署と社会保険労務士クラスがこれにあたります。

主語と観察者の関係を男女で例えるなら、主語は観察者で、男の子が片思いしている女の子のようなものです。少年は少女に夢中になっているが、少女はいつもぎりぎりのところで、覆い隠している。そこで、少年は少女に言った。僕は君を待つよ、もし家があるなら知らせてほしい、そうでなければ僕は待っていたよ。ここで少年は少女の観察者であり、少女が生み出すニュース、つまり帰郷があるかどうかに関心を持つ。だから、少女は帰宅メッセージが発生すると少年に通知し、ラブカップが誕生するわけですが、完全な観察者モデルが完全に実現されています。

SUBJECTとして、実装すべきインターフェースは以下の通りです。

  • オブザーバーの追加
  • オブザーバーを削除する
  • オブザーバを通知する

また、オブザーバーとして、通知を受け取る際の特定の動作を実装する必要があります。


rubyにはobserverというクラスがあり、それを使ってobserverパターンを実装することができます。

コード例です。

# -*- coding: GB2312 -*- 
 
require 'observer' 
# Example of using the observer pattern (ruby) 
 
# Observed P 
class PObservable 
include Observable 
 
end 
 
# Observer A 
class AObserver 
# update method name is required to have 
def update(arg) 
  puts "AObserver was notified " + arg 
end 
end 
 
# Observer B 
class BObserver 
# update method name is required to have 
def update(arg) 
  puts "BObserver was notified " + arg 
end 
end 
 
# Observer initialization 
observer_a = AObserver.new 
observer_b = BObserver.new 
 
# Observed observer initialization 
obj = PObservable.new 
 
# Add the observer object 
obj.add_observer(observer_a) 
obj.add_observer(observer_b) 
 
# Observed changed -> this code must be there otherwise the observer cannot be notified 
obj.changed 
 
# Notify the observer 
obj.notify_observers("Test") 
 

出力結果です。

AObserver was notified of Test
BObserver was notified of the Test