BehavioralC#verifiedVerified

Observer Pattern in C#

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

How to Implement the Observer Pattern in C#

1Step 1: Define the observer interface

public interface IObserver<in T>
{
    void Update(T data);
}

2Step 2: Subject maintains a list of observers

public class Subject<T>
{
    private readonly List<IObserver<T>> _observers = [];

    public void Subscribe(IObserver<T> observer) =>
        _observers.Add(observer);

    public void Unsubscribe(IObserver<T> observer) =>
        _observers.Remove(observer);

3Step 3: Notify all observers when state changes

    public void Notify(T data)
    {
        foreach (var observer in _observers)
            observer.Update(data);
    }
}

4Step 4: Concrete observer

public class ConsoleLogger : IObserver<string>
{
    public void Update(string data) =>
        Console.WriteLine($"Log: {data}");
}

// Usage:
// var subject = new Subject<string>();
// subject.Subscribe(new ConsoleLogger());
// subject.Notify("Something happened");

Observer Pattern Architecture

hourglass_empty

Rendering diagram...

lightbulb

Observer Pattern in the Real World

Think of a newspaper subscription service. The publisher (subject) doesn't know exactly who its subscribers (observers) are—it just maintains a list. When a new edition is printed, it delivers a copy to every subscriber on the list automatically. Subscribers can cancel at any time without the publisher needing to change anything.