読者です 読者をやめる 読者になる 読者になる

初めてのRailsアプリ(その8)

railsubject_08

初めてのRailsアプリ(その8)

すっ、好きなデザインパターンは、何ですか?(*ノωノ) イヤン

Observerパターンが、大好きです。。。❤(ӦvӦ。)

8. Observerパターン

RoRにおけるObserver パターンが便利なので、学習する。

JavaにおけるObserver

よく見覚えのあるJavaでの実装は以下のとおりであろう。コードに関しては省略する。

f:id:naotooncajon:20130813001520p:image

RubyにおけるObserver

Rubyでやるとこんな感じ。違いは以下。

  • Observableモジュールが提供されているので、被監視者(Subject)にmix-inをする。
  • 動的型付けなので、InterfaceObserverが不要。
    • 「updateを持ち、監視者のように振る舞うものは、明示されずとも監視者である」というダックタイピング?

f:id:naotooncajon:20130813001524p:image

実装

コードに落としこむとこんな感じ。ポイントは以下。

  • イニシャライザでobserverを設定している
  • Subjectの状態が変化したら、chagedしてからobserverに通知する

observer_pattern.rb

require 'observer'

# observal class
class Subject
  include Observable
  def initialize
    add_observer(Observer.new)
  end
  def hoge
    puts "I'm Subject. I have changed status by hoge"
    changed
    notify_observers(self)
  end
end

# observer class
class Observer
  def update(subject)
    puts "I'm Observer. I notice that Subject has changed status"
  end
end

# main
subject = Subject.new
subject.hoge

実行結果

mba:Ruby 7010oncajon$ ruby observer_pattern.rb 
I'm Subject. I have changed status by hoge
I'm Observer. I notice that Subject has changed status

RailsにおけるObserver

次回にやります。(これが本題だったのに。。。)

参考

増補改訂版Java言語で学ぶデザインパターン入門

オブザーバー Ruby 2.0.0 デザインパターン速攻習得