The Observer pattern is a design approach where one object (the subject) keeps a list of dependents (observers) and notifies them automatically of any state changes. This pattern helps in building systems where multiple components need to stay updated with changes without tight coupling.
Observer pattern in LLD - Architecture Diagram
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
System Overview - Observer pattern
Architecture Diagram
+------------+ notify() +-------------+
| Subject |---------------------->| Observer1 |
+------------+ +-------------+
| ^
| |
| |
| |
| notify() |
+-------------------------------> +-------------+
| Observer2 |
+-------------+Components
Subject
service
Maintains state and notifies observers about changes
Observer1
observer
Receives updates from Subject and reacts accordingly
Observer2
observer
Receives updates from Subject and reacts accordingly
Request Flow - 2 Hops
Subject → Observer1
Subject → Observer2
Failure Scenario
Component Fails:Observer1
Impact:Observer1 does not receive updates and may have stale data
Mitigation:Subject continues notifying other observers; Observer1 can resubscribe or recover later
Architecture Quiz - 3 Questions
Test your understanding
Which component holds the main state in the Observer pattern?
Design Principle
Practice
1.
What is the main purpose of the Observer pattern in system design?
easy
Solution
Step 1: Understand the Observer pattern role
The Observer pattern is designed to let one object notify others about changes automatically.Step 2: Match purpose with options
To allow objects to automatically update when another object changes correctly describes automatic updates between objects without tight coupling.Final Answer:
To allow objects to automatically update when another object changes -> Option BQuick Check:
Observer pattern = automatic updates [OK]
Hint: Observer means automatic update on change [OK]
Common Mistakes:
- Confusing Observer with data storage
- Thinking it creates class hierarchies
- Assuming it improves function speed
2.
Which of the following is the correct way to register an observer in the Observer pattern?
subject = Subject()
observer = ConcreteObserver()
# What code registers the observer?easy
Solution
Step 1: Recall common Observer pattern method names
Typically, the subject has a method namedattachoraddObserverto register observers.Step 2: Identify the most standard method
WhileaddObserveris used in some languages,attachis the classic and widely accepted method name.Final Answer:
subject.attach(observer) -> Option DQuick Check:
Register observer = subject.attach(observer) [OK]
Hint: Subject.attach(observer) is classic registration [OK]
Common Mistakes:
- Calling register on observer instead of subject
- Using subscribe which is not standard here
- Confusing addObserver with observer methods
3.
Given this code snippet, what will be printed?
class Subject:
def __init__(self):
self.observers = []
self.state = 0
def attach(self, observer):
self.observers.append(observer)
def set_state(self, state):
self.state = state
for obs in self.observers:
obs.update(state)
class Observer:
def __init__(self, name):
self.name = name
def update(self, state):
print(f"{self.name} received state {state}")
subject = Subject()
obs1 = Observer('A')
obs2 = Observer('B')
subject.attach(obs1)
subject.attach(obs2)
subject.set_state(5)medium
Solution
Step 1: Follow the attach and set_state calls
Observers A and B are attached to the subject. Whenset_state(5)is called, it updates the state and callsupdate(5)on each observer.Step 2: Understand the update method output
Each observer prints its name and the new state, so both print lines with state 5.Final Answer:
A received state 5 B received state 5 -> Option AQuick Check:
Observers print updated state 5 [OK]
Hint: Observers print on update call with new state [OK]
Common Mistakes:
- Thinking observers print old state
- Assuming no output without explicit print
- Confusing method names causing errors
4.
Identify the bug in this Observer pattern implementation:
class Subject:
def __init__(self):
self.observers = set()
def attach(self, observer):
self.observers.add(observer)
def notify(self):
for obs in self.observers:
obs.update()
class Observer:
def update(self, state):
print(f"State updated to {state}")
subject = Subject()
obs = Observer()
subject.attach(obs)
subject.notify()medium
Solution
Step 1: Check method signatures and calls
The Observer'supdatemethod expects astateargument, butnotifycallsupdate()without any argument.Step 2: Identify mismatch causing error
This mismatch will cause a runtime error due to missing required positional argument.Final Answer:
Observer.update requires a state argument but notify calls without it -> Option AQuick Check:
Method argument mismatch causes error [OK]
Hint: Check method parameters match calls exactly [OK]
Common Mistakes:
- Ignoring missing argument errors
- Thinking sets are invalid for observers
- Misunderstanding attach method purpose
5.
You are designing a stock price alert system using the Observer pattern. Multiple clients want updates only when the stock price changes by more than 5%. How should you modify the Observer pattern to handle this efficiently?
hard
Solution
Step 1: Understand the requirement for selective updates
Clients want updates only if price changes exceed 5%, so notifying on every change is inefficient.Step 2: Implement threshold logic in Subject
Adding a check in the Subject to compare new price with old and notify observers only if change > 5% reduces unnecessary notifications.Final Answer:
Add a threshold check in the Subject before notifying observers -> Option CQuick Check:
Efficient notify = threshold check in Subject [OK]
Hint: Filter notifications in Subject to reduce updates [OK]
Common Mistakes:
- Not filtering updates causing overload
- Using polling which wastes resources
- Removing Observer pattern loses decoupling benefits
