Приведи пример паттерна Медиатор
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Пример реализации паттерна Медиатор на C#
Медиатор (Mediator) — поведенческий паттерн проектирования, который уменьшает связанность множества классов между собой, перемещая их взаимодействие в единый класс-посредник.
Суть паттерна
Вместо прямого взаимодействия объектов друг с другом (что создаёт сильно связанную систему), объекты взаимодействуют через централизованный объект-медиатор. Это упрощает поддержку кода, так как логика взаимодействия централизована, и добавление новых участников не требует изменения существующих классов.
Классический пример: чат-комната
Рассмотрим реализацию системы чата, где пользователи отправляют сообщения, но не взаимодействуют напрямую, а через медиатор (чат-комнату).
1. Интерфейс медиатора
public interface IChatMediator
{
void SendMessage(string message, User user);
void AddUser(User user);
}
2. Конкретный медиатор
public class ChatRoom : IChatMediator
{
private List<User> _users = new List<User>();
public void AddUser(User user)
{
_users.Add(user);
user.SetMediator(this);
}
public void SendMessage(string message, User sender)
{
foreach (var user in _users)
{
// Отправляем сообщение всем, кроме отправителя
if (user != sender)
{
user.Receive(message);
}
}
}
}
3. Абстрактный класс коллеги
public abstract class User
{
protected IChatMediator _mediator;
public string Name { get; }
protected User(string name)
{
Name = name;
}
public void SetMediator(IChatMediator mediator)
{
_mediator = mediator;
}
public abstract void Send(string message);
public abstract void Receive(string message);
}
4. Конкретные классы коллег
public class ChatUser : User
{
public ChatUser(string name) : base(name) { }
public override void Send(string message)
{
Console.WriteLine($"{Name} отправляет: {message}");
_mediator.SendMessage(message, this);
}
public override void Receive(string message)
{
Console.WriteLine($"{Name} получает: {message}");
}
}
5. Клиентский код
class Program
{
static void Main(string[] args)
{
// Создаем медиатор
IChatMediator chatRoom = new ChatRoom();
// Создаем пользователей
User user1 = new ChatUser("Алексей");
User user2 = new ChatUser("Мария");
User user3 = new ChatUser("Иван");
// Регистрируем пользователей в чат-комнате
chatRoom.AddUser(user1);
chatRoom.AddUser(user2);
chatRoom.AddUser(user3);
// Пользователи отправляют сообщения через медиатор
user1.Send("Привет всем!");
user2.Send("Привет, Алексей!");
user3.Send("Как дела?");
}
}
Преимущества паттерна Медиатор
- Уменьшение связанности — объекты не знают друг о друге, взаимодействуя только через медиатор
- Централизация управления — вся логика взаимодействия в одном месте
- Упрощение повторного использования — компоненты можно использовать независимо
- Упрощение тестирования — медиатор можно легко подменить или протестировать отдельно
Недостатки
- Медиатор может стать "божественным объектом" — если логика станет слишком сложной, медиатор превратится в монолитный класс
- Усложнение системы — добавление нового посредника увеличивает сложность архитектуры
Применение в реальных проектах
- Системы событий — когда множество компонентов реагируют на события других компонентов
- UI-фреймворки — взаимодействие элементов управления без прямых ссылок друг на друга
- Игровые движки — управление взаимодействием игровых объектов
- Бизнес-логика — координация действий различных сервисов в enterprise-приложениях
Паттерн Медиатор особенно полезен в системах, где количество связей между объектами растёт экспоненциально, помогая поддерживать код чистым и расширяемым.