You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.2 KiB
Ruby

# An object, called the subject, maintains a list of its dependents, called
# observers, and notifies them automatically of any state changes, usually by
# calling one of their methods.
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, @title, @salary = name, title, 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
# Usage
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