observer
Define a one-to-many dependency so that when one object changes state all its dependents are notified automatically.
Files1
View on GitHubSKILL.mdskills/code-quality/observer/SKILL.md
GitHubObserver
Lets objects (observers/subscribers) register interest in another object (subject/publisher). When the subject changes, all observers are notified automatically.
When to Use
- Changes to one object require updating an unknown number of others
- An object should notify others without making assumptions about who they are
- Event-driven architectures, reactive state management, MVC (Model notifies View)
- Decoupling producers from consumers of events
How to Apply
- Define an
Observerinterface with anupdate(event)method - Define a
Subjectinterface withsubscribe(),unsubscribe(), andnotify()methods - Implement concrete
Subjectthat manages its observer list and callsnotify()on state change - Implement concrete observers that react in
update()
Example
interface Observer { update(data: unknown): void; }
class EventEmitter {
private listeners = new Map<string, Set<Observer>>();
on(event: string, obs: Observer) {
if (!this.listeners.has(event)) this.listeners.set(event, new Set());
this.listeners.get(event)!.add(obs);
}
off(event: string, obs: Observer) { this.listeners.get(event)?.delete(obs); }
emit(event: string, data?: unknown) {
this.listeners.get(event)?.forEach(o => o.update(data));
}
}
class StockTicker extends EventEmitter {
private price = 0;
setPrice(p: number) { this.price = p; this.emit('price', p); }
}
const ticker = new StockTicker();
ticker.on('price', { update: (p) => console.log(`Alert: price = ${p}`) });
ticker.setPrice(42); // Alert: price = 42