かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

暇つぶしに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"