Variations on the Observer Pattern
The key decisions that you need to make when implementing the Observer pattern all center on the interface between the subject and the observer. At the simple end of the spectrum, you might do what we did in the example above: Just have a single method in the observer whose only argument is the subject. The GoF term for this strategy is the pull method, because the observers have to pull whatever details about the change that they need out of the subject. The other possibility—logically enough termed the push method—has the subject send the observers a lot of details about the change:
observer.update(self, :salary_changed, old_salary, new_salary)
We can even define different update methods for different events. For example, we could have one method for a salary update
observer.update_salary(self, old_salary, new_salary)
and a different method for title changes
observer.update_title(self, old_title, new_title)
The advantage in providing more details is that the observers do not have to work quite as hard to keep track of what is going on. The disadvantage of the push model is that if all of the observers are not interested in all of the details, then the work of passing the data around goes for naught.