module Observable
def initialize
@observers = []
end
def add_observer(observer)
@observers << observer unless @observers.include?(observer)
end
def delete_observer(observer)
@observers.delete(observer)
end
def notify_observers
@observers.each {|x| x.update(self)}
end
end
class Employee
include Observable
attr_reader :name
attr_accessor :title, :salary
def initialize(name, title, salary)
super()
@name = name
@title = title
@salary = salary
end
end
class BaseObserver
def update
raise 'Must be implement "update" function'
end
end
class Payroll < BaseObserver
def update(employee )
p("Cut a new check for #{employee.name}!")
p("His salary is now #{employee.salary}!")
end
end
class TaxMan < BaseObserver
def update(employee)
p("Send #{employee.name} a new tax bill!")
end
end
mike = Employee.new('Mike', 'project manger', 25000)
mike.add_observer(Payroll.new)
mike.add_observer(TaxMan.new)
mike.salary = 35000
mike.title = 'senior project manger'
mike.notify_observers