Посредник (Mediator)

Шаблон Посредник служит для обеспечения коммуникации между объектами. Этот шаблон также инкапсулирует протокол, которому должна удовлетворять процедура коммуникации.

Приведём следующую иллюстрацию возможного применения шаблона Посредник. Пусть имеется электронная форма для ввода анкетных данных. Эта форма содержит различные элементы управления – объекты определённых классов. Сценарий работы с формой предполагает изменение состояния одних объектов в зависимости от состояния других. Например, в зависимости от значения поля «Пол» меняется доступность переключателя «Служили ли в армии?». Тривиальное решение предполагает, что каждый из объектов, соответствующих определённому элементу формы, при изменении собственных данных будет изменять состояние связанных с ним объектов. Это приводит к росту зависимостей между объектами и увеличению сложности системы. Использование шаблона Посредник подразумевает выделение отдельного объекта, «дирижирующего» поведением элементов управления в зависимости от их текущего состояния.

Дизайн шаблона Посредник предполагает наличие двух выделенных классов, использующих сообщения для взаимного обмена информацией: Colleague (коллега) и Mediator (посредник). Объект Colleague регистрирует объект Mediator и сохраняет его в своём внутреннем поле. В свою очередь, посредник поддерживает список зарегистрировавших его объектов. Как только один из объектов Colleague вызывает свой метод Send(), посредник вызывает у остальных зарегистрированных объектов метод Receive().

Рис. 14. Дизайн шаблона Посредник.

Далее представлен код, демонстрирующий использование шаблона.

using System;

using System.Collections.Generic;

public class Mediator

{

private ISet<Colleague> _colleagues = new HashSet<Colleague>();

public void SignOn(Colleague colleague)

{

_colleagues.Add(colleague);

}

public void Send(string message, string from)

{

foreach (var colleague in _colleagues)

{

colleague.Receive(message, from);

}

}

}

public class Colleague

{

private readonly Mediator _mediator;

private readonly string _name;

public Colleague(Mediator mediator, string name)

{

_mediator = mediator;

_name = name;

mediator.SignOn(this);

}

public virtual void Receive(string message, string from)

{

Console.WriteLine("{0} received from {1}: {2}",

_name, from, message);

}

public void Send(string message)

{

Console.WriteLine("Send (from {0}): {1}", _name, message);

_mediator.Send(message, _name);

}

}

public class MediatorExample

{

public static void Main()

{

var mediator = new Mediator();

var john = new Colleague(mediator, "John");

var lucy = new Colleague(mediator, "Lucy");

var david = new Colleague(mediator, "David");

john.Send("Meeting on Tuesday, please all ack");

david.Send("Ack");

john.Send("Still awaiting some acks");

lucy.Send("Ack");

john.Send("Thanks all");

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: