Created
February 3, 2013 10:00
-
-
Save ackintosh/4701126 to your computer and use it in GitHub Desktop.
Observer pattern in Ruby
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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