Skip to content

Instantly share code, notes, and snippets.

@ackintosh
Created February 3, 2013 10:00
Show Gist options
  • Save ackintosh/4701126 to your computer and use it in GitHub Desktop.
Save ackintosh/4701126 to your computer and use it in GitHub Desktop.
Observer pattern in Ruby
class Payroll
def update(changed_employee)
puts("I cut a check for #{changed_employee.name}")
puts("His salary is now #{changed_employee.salary}")
end
end
class TaxMan
def update(changed_employee)
puts("I will send a new invoice to #{changed_employee.name}")
end
end
module Subject
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 Employee
include Subject
attr_reader :name, :title
attr_accessor :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.0)
payroll = Payroll.new
fred.add_observer(payroll)
taxman = TaxMan.new
fred.add_observer(taxman)
fred.salary = 35000.0
# I cut a check for Fred
# His salary is now 35000.0
# I will send a new invoice to Fred
# Using Observable module
require 'observer'
class Payroll
def update(changed_employee)
puts("I cut a check for #{changed_employee.name}")
puts("His salary is now #{changed_employee.salary}")
end
end
class TaxMan
def update(changed_employee)
puts("I will send a new invoice to #{changed_employee.name}")
end
end
class Employee
include Observable
attr_reader :name, :title
attr_accessor :salary
def initialize(name, title, salary)
@name = name
@title = title
@salary = salary
end
def salary=(new_salary)
@salary = new_salary
changed
notify_observers(self)
end
end
fred = Employee.new("Fred", "Crane Operator", 30000.0)
payroll = Payroll.new
fred.add_observer(payroll)
taxman = TaxMan.new
fred.add_observer(taxman)
fred.salary = 35000.0
# I cut a check for Fred
# His salary is now 35000.0
# I will send a new invoice to Fred
# Using Codeblock
module Subject
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 Subject
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.0)
fred.add_observer do |changed_employee|
puts("I cut a new check for #{changed_employee.name}")
puts("His salary is now #{changed_employee.salary}")
end
fred.salary = 35000.0
# I cut a new check for Fred
# His salary is now 35000.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment