Посредник (Mediator) :: Cетевой уголок Majestio

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


Посредник — это поведенческий паттерн проектирования, который позволяет уменьшить связанность множества классов между собой, благодаря перемещению этих связей в один класс-посредник.

Применимость

Подробнее на 👉 refactoring.guru

UML-диаграмма

Пример реализации

#include <iostream>
#include <string>
#include <vector>

class Mediator;

// Интерфейс компонента

class Component {
 public:
  virtual void send(const std::string& event) = 0;
  virtual void receive(const std::string& event) const = 0;
  virtual void setMediator(Mediator* mediator) = 0;
};

// Посредник

class Mediator {
 public:
  virtual void notify(Component* sender, const std::string& event) const = 0;
};

// Конкретный компонент 1

class Component1 : public Component {
 private:
  Mediator* mediator;

 public:
  void setMediator(Mediator* mediator) override { this->mediator = mediator; }

  void send(const std::string& event) override {
    mediator->notify(this, event);
  }

  void receive(const std::string& event) const override {
    std::cout << "Компонент 1 получил сообщение: " << event << std::endl;
  }
};

// Конкретный компонент 2

class Component2 : public Component {
 private:
  Mediator* mediator;

 public:
  void setMediator(Mediator* mediator) override { this->mediator = mediator; }

  void send(const std::string& event) override {
    mediator->notify(this, event);
  }

  void receive(const std::string& event) const override {
    std::cout << "Компонент 2 получил сообщение: " << event << std::endl;
  }
};

// Конкретный компонент 3

class Component3 : public Component {
 private:
  Mediator* mediator;

 public:
  void setMediator(Mediator* mediator) override { this->mediator = mediator; }

  void send(const std::string& event) override {
    mediator->notify(this, event);
  }

  void receive(const std::string& event) const override {
    std::cout << "Компонент 3 получил сообщение: " << event << std::endl;
  }
};

// Конкретный посредник

class ConcreteMediator : public Mediator {
 private:
  std::vector<Component*> components;

 public:
  void notify(Component* sender, const std::string& event) const override {
    for (Component* component : components) {
      if (component != sender) {
        component->receive(event);
      }
    }
  }

  void registerComponent(Component* component) {
    component->setMediator(this);
    components.push_back(component);
  }
};

// Клиентский код

int main() {
  ConcreteMediator mediator;
  Component1 component1;
  Component2 component2;
  Component3 component3;

  mediator.registerComponent(&component1);
  mediator.registerComponent(&component2);
  mediator.registerComponent(&component3);

  component1.send("Событие 1");
  component2.send("Событие 2");

  return 0;
}
Будет напечатано:
Компонент 2 получил сообщение: Событие 1
Компонент 3 получил сообщение: Событие 1
Компонент 1 получил сообщение: Событие 2
Компонент 3 получил сообщение: Событие 2
abstract class Mediator {
  void notify(Component sender, String event);
}

abstract class Component {
  Mediator? mediator;

  void send(String event) {
    mediator?.notify(this, event);
  }

  void receive(String event);
}

class Component1 extends Component {
  @override
  void receive(String event) {
    print('Компонент 1 получил сообщение: $event');
  }
}

class Component2 extends Component {
  @override
  void receive(String event) {
    print('Компонент 2 получил сообщение: $event');
  }
}

class Component3 extends Component {
  @override
  void receive(String event) {
    print('Компонент 3 получил сообщение: $event');
  }
}

class ConcreteMediator implements Mediator {
  List<Component> _components = [];

  @override
  void notify(Component sender, String event) {
    for (Component component in _components) {
      if (component != sender) {
        component.receive(event);
      }
    }
  }

  void registerComponent(Component component) {
    component.mediator = this;
    _components.add(component);
  }
}

void main() {
  var mediator = ConcreteMediator();
  var component1 = Component1();
  var component2 = Component2();
  var component3 = Component3();

  mediator.registerComponent(component1);
  mediator.registerComponent(component2);
  mediator.registerComponent(component3);

  component1.send('Событие 1');
  component2.send('Событие 2');
}
Будет напечатано:
Компонент 2 получил сообщение: Событие 1
Компонент 3 получил сообщение: Событие 1
Компонент 1 получил сообщение: Событие 2
Компонент 3 получил сообщение: Событие 2
Рейтинг: 0/5 - 0 голосов