Monday, August 25, 2014

Observer pattern ruby



Current implementation dont have base class for Observers. Observer methods moved to module. This is a basic solution without any checkings.
module ObserverMethods
  def initialize
    @observers = []
  end
  def add_observer(observer)
    @observers << observer
  end
  def delete_observer(observer)
    @observers.delete(observer)
  end
  def notify_observers
    @observers.each do |observer|
      observer.update(self)
    end
  end
end


class Entity
  include ObserverMethods
  
  attr_reader :name, :description
  
  def name=(value)
    @name = value
    notify_observers
  end
  def description=(value)
    @description = value
    notify_observers
  end
end

class TxtObserver
  def update(entity)
    puts "txt: #{entity.name}, #{entity.description}"
  end
end
class TxtConsoleObserver
  def update(entity)
    puts ">> #{entity.name}, #{entity.description}"
  end
end


entity = Entity.new
entity.add_observer(TxtConsoleObserver.new)
entity.add_observer(TxtObserver.new)

entity.name = "Name"
entity.description = "Description"

$ ruby observer.rb 
>> Name, 
txt: Name, 
>> Name, Description
txt: Name, Description

No comments:

Post a Comment