Wednesday, October 29, 2008

Ruby observerパターン


   1  module Observable

   2    def add_observer(observer)

   3      @observers ||= []

   4      @observers << observer

   5    end

   6    

   7    def notify_observers(*objs)

   8      @observers.each do |obs|

   9        obs.update(*objs)

  10      end

  11    end

  12  end

  13  

  14  class Tick

  15    include Observable

  16    def start

  17      loop do

  18        now = Time.now

  19        notify_observers(now.hour, now.min, now.sec)

  20        sleep 0.9

  21      end

  22    end

  23  end

  24  

  25  class Clock

  26    def update(h, m, s)

  27      printf "\e[8D%02d:%02d:%02d", h, m, s

  28      STDOUT.flush

  29    end

  30  end

  31  tick = Tick.new

  32  tick.add_observer(Clock.new)

  33  tick.start

No comments: