初めてのRailsアプリ(その8)
railsubject_08
初めてのRailsアプリ(その8)
すっ、好きなデザインパターンは、何ですか?(*ノωノ) イヤン
Observerパターンが、大好きです。。。❤(ӦvӦ。)
8. Observerパターン
RoRにおけるObserver パターンが便利なので、学習する。
JavaにおけるObserver
よく見覚えのあるJavaでの実装は以下のとおりであろう。コードに関しては省略する。
RubyにおけるObserver
Rubyでやるとこんな感じ。違いは以下。
- Observableモジュールが提供されているので、被監視者(Subject)にmix-inをする。
- 動的型付けなので、InterfaceObserverが不要。
- 「updateを持ち、監視者のように振る舞うものは、明示されずとも監視者である」というダックタイピング?
実装
コードに落としこむとこんな感じ。ポイントは以下。
- イニシャライザで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
次回にやります。(これが本題だったのに。。。)