A Day in the Life

RubyのObservable

http://www.ruby-lang.org/ja/man/?cmd=view;name=Observable

ActiveRecordのソース読んでて、Observerパターンのところでinclude Observableとmix-inしててなんじゃこりゃって思ったので調べたら、標準添付ライブラリでこんなんあったのねー。
つーことで結城さんのJava言語で学ぶデザインパターン入門のObserverパターンのサンプルをObservableを使って実装してみた。

#!/usr/bin/env ruby
require 'observer'

class RandomNumberGenerator
  include Observable
  attr_reader :number

  def execute
    20.times do
      @number = rand 50
      self.changed
      notify_observers self
    end
  end

end

class DigitObserver
  def update(generator)
    puts "DigitObserver:" + generator.number.to_s
  end
end

class GraphObserver
  def update(generator)
    puts "GraphObserver:" + "*" * generator.number
  end
end

generator = RandomNumberGenerator.new
generator.add_observer DigitObserver.new
generator.add_observer GraphObserver.new
generator.execute

実行結果

DigitObserver:29
GraphObserver:*****************************
DigitObserver:11
GraphObserver:***********
DigitObserver:3
GraphObserver:***
DigitObserver:28
GraphObserver:****************************
〜続く〜

ウホッ、楽ちん!java.util.ObservableのRuby移植っぽいなぁ。PerlにもClass::Observableなんてものがあるのね。

記事の一覧 >