資料を作っていて、オブザーバパターンで直感的に理解できる例がないかな。。。と考えていました。
オブザーバパターンとはこんな感じ。
思いつきそうで思いつかない。。。とりあえず思いついたのがダチョウ倶楽部の鉄板ネタ「どうぞどうぞ」でした。
上島さんが「じゃ、俺がやります」と手を上げると、肥後さんや寺門さんが「どうぞどうぞ」と譲ってくれます。
とりあえず、ベタで書くと以下のような感じになります。コードは可能な限りシンブルにしました。Ueshimaクラスのraise_handを実行したあと、Ueshimaクラス内でMemberクラスを生成してnotifyを実行します。そもそも上島さんが2人に「どうぞ」と言えと指示しているわけではないのでオカシイのですが、UeshimaクラスがMemberクラスを知っていているのが気持ち悪いわけです。
class Ueshima def raise_hand puts "じゃ、俺やります" Member.new.notify Member.new.notify end end class Member def notify puts "どうぞ" end end ueshima = Ueshima.new ueshima.raise_hand
UeshimaクラスとMemberクラスを分離したのが以下になります。
class Ueshima def initialize(o) @observers = o end def raise_hand puts "じゃ、俺やります" @observers.each do |e| e.notify end end end class Member def notify puts "どうぞ" end end ueshima = Ueshima.new([Member.new, Member.new]) ueshima.raise_hand
Ueshimaクラスでraise_handメソッドがコールされたときに、オブザーバのメソッドを呼び出すことができます。メンバーは上島さんが手を上げるのを監視して待っているイメージです。ちょっとオブザーバって感じがするかなぁ?
Ueshimaクラスは@observersという配列変数を持っていて、それぞれの要素はnotifyというメソッドをもったインスタンスであることを期待しているだけで、Memberクラスのことは知らなくて済んでいます。
とりあえず思いついたので書いておきました。
はい。