using System.Collections.Generic;
public static void Main()
var observable = new NotificationProvider();
var observer = new NotificationSubscriber();
observer.Subscribe(observable);
observable.NotificationEvent("Event 1 just happened");
observable.NotificationEvent("Event 2 just happened");
observable.NotificationEvent("Event 3 just happened");
public string Description { get; set; }
public DateTime Date { get; set; }
public SomeEvent(string description, DateTime date)
Description = description;
public class Unsubscriber : IDisposable
private List<IObserver<SomeEvent>> _observers;
private IObserver<SomeEvent> _observer;
public Unsubscriber(List<IObserver<SomeEvent>> observers,
IObserver<SomeEvent> observer)
this._observers = observers;
this._observer = observer;
if (!(_observer == null)) _observers.Remove(_observer);
public class NotificationProvider : IObservable<SomeEvent>
private List<IObserver<SomeEvent>> _observers;
public NotificationProvider()
_observers = new List<IObserver<SomeEvent>>();
public IDisposable Subscribe(IObserver<SomeEvent> observer)
if (!_observers.Contains(observer))
_observers.Add(observer);
return new Unsubscriber(_observers, observer);
public void NotificationEvent(string description)
foreach (var observer in _observers)
observer.OnNext(new SomeEvent(description,
public class NotificationSubscriber : IObserver<SomeEvent>
private IDisposable _unsubscriber;
public virtual void Subscribe(IObservable<SomeEvent> provider)
_unsubscriber = provider.Subscribe(this);
public virtual void OnCompleted()
Console.WriteLine("Done");
public virtual void OnError(Exception e)
Console.WriteLine($"Error: {e.Message}");
public virtual void OnNext(SomeEvent ev)
Console.WriteLine($"{ev.Date}: {ev.Description}");
public virtual void Unsubscribe()