63 lines
1.2 KiB
Ruby
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
|