Code Blocks as Observers : Observer « Design Patterns « Ruby






Code Blocks as Observers


module Observable
  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.call(self)
    end
  end
end

class Employee
  include Observable

  attr_accessor :name, :title, :salary

  def initialize( name, title, salary )
    super()
    @name = name
    @title = title
    @salary = salary
  end

  def salary=(new_salary)
    @salary = new_salary
    notify_observers
  end
end
fred = Employee.new('Fred', 'Crane Operator', 30000)

fred.add_observer do |changed_employee|
    puts("Cut a new check for #{changed_employee.name}!")
    puts("His salary is now #{changed_employee.salary}!")
end

 








Related examples in the same category

1.Coupling Systems Loosely with Callbacks
2.Staying Informed (Observer pattern)
3.Add another observer