Observer

behavioral

Defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

Intent

The Observer pattern defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

Motivation

When you need to maintain consistency between related objects without making them tightly coupled, the Observer pattern is useful. It's particularly useful for implementing distributed event handling systems.

Structure

The pattern involves a Subject that maintains a list of Observers and notifies them of state changes. Observers register with the Subject to receive updates.

Participants

  • Subject - knows its observers and provides an interface for attaching and detaching Observer objects
  • Observer - defines an updating interface for objects that should be notified of changes
  • ConcreteSubject - stores state of interest to ConcreteObserver objects
  • ConcreteObserver - maintains a reference to a ConcreteSubject and implements the Observer updating interface

Pros

  • Loose coupling between Subject and Observer
  • Support for broadcast communication
  • Dynamic relationships between objects
  • Follows Open/Closed Principle

Cons

  • Unexpected updates can occur
  • Memory leaks if observers are not properly unregistered
  • Order of notification is not guaranteed
  • Can lead to performance issues with many observers

Use Cases

Event handling systems
Model-View-Controller (MVC) architecture
Real-time data updates
Pub/sub messaging systems
Social media notifications
Stock price monitoring

Implementation Tips

Considerations

  • Decide who triggers the update (Subject or Observers)
  • Consider using weak references to prevent memory leaks
  • Think about update granularity
  • Handle observer removal during notification

Tips

  • Provide methods for registering and unregistering observers
  • Consider using events or callbacks for notifications
  • Document the update protocol clearly
  • Consider using weak references in languages that support them

Interactive Code Editor

Related Patterns