Sunday, October 16, 2011

Observer pattern in ruby

Created quickly a couple of classes to show the observer pattern in Ruby .
class Subject
def initialize
@name = "Subject1"
p "Subect initialized to #{@name}"
@observerList=Array.new #initialize the observer list
end
def name=(n)
@name = n
p "Subject's name changed to #{@name}"
setChanged(); #indicate the object has been changed - that calls the publishing function
notifyObservers
end
def addObserver(observer)
if (defined?@observerList).nil? #if our observer array is damaged
p "Some problem with observer list - no array defined"
else
@observerList[@observerList.length] = observer
end
end
def setChanged
@@changed = 0
end
def clearChanged
@@changed = 1
end
def hasChanged?
@@changed ||= 1
end
def notifyObservers
if hasChanged?
@observerList.each do |observerToNotify| #notify all the observers
observerToNotify.update(@name)
p "#{observerToNotify} has been updated"
end
clearChanged #notification complete
p "Clear changed called.<end>"
end
end
end
class Observer
def initialize
@name = "Initial observer name"
p @name
end
def update(name)
@name = name
p "Updated name in observer to #{@name}" #just for testing
end
end
s1 = Subject.new
o1 = Observer.new
s1.addObserver(o1)
s1.name="Arun"


Note : work to be done in finding the name of the object in the block under notifyObservers method.