memorandums

日々のメモです。

おぶざーば・ぱたーん

資料を作っていて、オブザーバパターンで直感的に理解できる例がないかな。。。と考えていました。

オブザーバパターンとはこんな感じ。

Observer パターン - Wikipedia

思いつきそうで思いつかない。。。とりあえず思いついたのがダチョウ倶楽部の鉄板ネタ「どうぞどうぞ」でした。

www.youtube.com

上島さんが「じゃ、俺がやります」と手を上げると、肥後さんや寺門さんが「どうぞどうぞ」と譲ってくれます。

とりあえず、ベタで書くと以下のような感じになります。コードは可能な限りシンブルにしました。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クラスのことは知らなくて済んでいます。

とりあえず思いついたので書いておきました。

はい。