かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

暇つぶしにObserverパターンしてみる

class Observable
    def initialize
        super
        @observers = []
    end
    
    def add_observer observer
        @observers.push observer
    end
    
    def notify *args
        @observers.each do |obs|
            obs.update(self, *args)
        end
    end
    
    def self.attr_notify_accessor *params
        params.each do |param|
            name = param.to_s
            eval(<<-E)
                def #{name}=(value)
                    @#{name} = value
                    notify :#{name}, @#{name}
                end
                def #{name}
                    return @#{name}
                end
            E
        end
    end
end

class Person < Observable
    attr_notify_accessor :name, :age
end

class PersonView
    def update(person, prop, value)
        p "#{person}, #{prop}, #{value}"
    end
end

p = Person.new
p.add_observer PersonView.new
p.name = "Tarou"
p.age = 10

実行結果

"#<Person:0x293f718>, name, Tarou"
"#<Person:0x293f718>, age, 10"