Problem Statement
When multiple parts of a system need to stay updated about changes in another part, manually notifying each part leads to tightly coupled code and missed updates. This causes bugs and makes the system hard to maintain or extend.
This diagram shows a Subject holding references to multiple Observers. Observers register to the Subject, and when the Subject's state changes, it notifies all registered Observers.
### Before: Without Observer Pattern class Subject: def __init__(self): self.state = None self.observer1 = None self.observer2 = None def set_state(self, state): self.state = state if self.observer1: self.observer1.update(state) if self.observer2: self.observer2.update(state) class Observer1: def update(self, state): print(f"Observer1: State updated to {state}") class Observer2: def update(self, state): print(f"Observer2: State updated to {state}") subject = Subject() subject.observer1 = Observer1() subject.observer2 = Observer2() subject.set_state('ON') ### After: With Observer Pattern class Subject: def __init__(self): self._observers = [] self._state = None def register(self, observer): self._observers.append(observer) def unregister(self, observer): self._observers.remove(observer) def notify(self): for observer in self._observers: observer.update(self._state) def set_state(self, state): self._state = state self.notify() class Observer: def update(self, state): print(f"Observer: State updated to {state}") subject = Subject() observer1 = Observer() observer2 = Observer() subject.register(observer1) subject.register(observer2) subject.set_state('ON')