using System.Collections.Generic;
public static void Main()
var mediator = new ConcreteMediator();
mediator.RegisterComponent<Database>();
mediator.RegisterComponent<Logger>();
var notifier = mediator.RegisterComponent<Notifier>();
notifier.Send("Hello Pattern!");
public class ConcreteMediator : Mediator
List<Component> components = new List<Component>();
public T RegisterComponent<T>() where T : Component, new()
public override void Send(string message, Component component)
if (component.GetType() == typeof(Notifier))
components.Where(c => c != component).ToList().ForEach(c => c.HandleMessage(message, component));
else if (component.GetType() == typeof(Database))
components.Where(c => c.GetType() == typeof(Notifier) || c.GetType() == typeof(Logger)).ToList().ForEach(c => c.HandleMessage(message, component));
public class Database : Component
public override void HandleMessage(string message, Component sender)
Console.WriteLine("Database\n received:\t\"{0}\" \n from:\t\t\"{1}\"", message, sender);
this.mediator.Send("Database saved correctly", this);
public class Logger : Component
public override void HandleMessage(string message, Component sender)
Console.WriteLine("Logger\n received:\t\"{0}\" \n from:\t\t\"{1}\"", message, sender);
public class Notifier : Component
public override void HandleMessage(string message, Component sender)
Console.WriteLine("Notifier\n received:\t\"{0}\" \n from:\t\t\"{1}\"", message, sender);
public abstract class Mediator
public abstract void Send(string message, Component component);
public abstract class Component
protected Mediator mediator;
internal void SetMediator(Mediator mediator) => this.mediator = mediator;
public virtual void Send(string message)
this.mediator.Send(message, this);
public abstract void HandleMessage(string message, Component sender);