The mediator pattern encapsulate the interaction between a set of objects.
Also it encapsulate the protocol between those objects. The pattern help
to lose couple the object by keeping them from referring one each other.
Use Cases for the Mediator Pattern
You should use the pattern in the following cases:
#region Mediator
public interface Mediator
{
#region Methods
void Send(string message, Colleague colleague);
#endregion
}
#endregion
#region Concrete Mediator
public class ConcreteMediator : Mediator
{
#region Properties
public List<ConcreteColleague> Colleagues { get; private set; }
#endregion
#region Ctor
public ConcreteMediator()
{
Colleagues = new List<ConcreteColleague>();
}
#endregion
#region Mediator Members
public void Send(string message, Colleague colleague)
{
foreach (Colleague currentColleague in Colleagues)
{
if (!currentColleague.Equals(colleague))
{
currentColleague.Recieve(message);
}
}
}
#endregion
}
#endregion
#region Colleague
public abstract class Colleague
{
#region Members
protected Mediator _mediator;
#endregion
#region Ctor
public Colleague(Mediator mediator)
{
_mediator = mediator;
}
#endregion
#region Methods
/// <summary>
/// Sends the given message
/// </summary>
/// <param name="message">The given message</param>
public abstract void Send(string message);
/// <summary>
/// Recieves the given message
/// </summary>
/// <param name="message">The given message</param>
public abstract void Recieve(string message);
#endregion
}
#endregion
#region Concrete Colleague
public class ConcreteColleague : Colleague
{
#region Properties
public int ID { get; set; }
#endregion
#region Ctor
public ConcreteColleague(Mediator mediator, int id)
: base(mediator)
{
ID = id;
}
#endregion
#region Methods
public override void Send(string message)
{
_mediator.Send(message, this);
}
public override void Recieve(string message)
{
Console.WriteLine("{0} recieved the message: {1}",
ID, message);
}
#endregion
}
#endregion
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague colleague1 = new ConcreteColleague(mediator, 1);
ConcreteColleague colleague2 = new ConcreteColleague(mediator, 2);
mediator.Colleagues.Add(colleague1);
mediator.Colleagues.Add(colleague2);
colleague1.Send("Hello from colleague 1");
colleague2.Send("Hello from colleague 2");
Console.Read();