using System.Collections.Generic;
public static void Main(string[] args){
var fbObservable = new NotificationProvider("Facebook");
var githubObservable = new NotificationProvider("GitHub");
var observer = new NotificationSubscriber("Florin");
observer.Subscribe(fbObservable);
observer.Subscribe(githubObservable);
var observer2 = new NotificationSubscriber("Piagio");
observer2.Subscribe(fbObservable);
fbObservable.EventNotification("Event notification 1 !");
githubObservable.EventNotification("Event notification!");
public class NotificationProvider : IObservable<SomeEvent>{
public string ProviderName { get; private set; }
private List<IObserver<SomeEvent>> _observers;
public NotificationProvider(string _providerName){
ProviderName = _providerName;
_observers = new List<IObserver<SomeEvent>>();
private 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 IDisposable Subscribe(IObserver<SomeEvent> observer){
if (!_observers.Contains(observer))
_observers.Add(observer);
return new Unsubscriber(_observers, observer);
public void EventNotification(string description){
foreach (var observer in _observers){
observer.OnNext(new SomeEvent(ProviderName, description,
public class NotificationSubscriber : IObserver<SomeEvent>{
public string SubscriberName { get; private set; }
private IDisposable _unsubscriber;
public NotificationSubscriber(string _subscriberName){
SubscriberName = _subscriberName;
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($"Hey {SubscriberName} -> you received {ev.EventProviderName} {ev.Description} @ {ev.Date} ");
public virtual void Unsubscribe(){
public string EventProviderName { get; set; }
public string Description { get; set; }
public DateTime Date { get; set; }
public SomeEvent(string _eventProviderName, string _description, DateTime _date){
EventProviderName = _eventProviderName;
Description = _description;