Подробнее на 👉 refactoring.guru
#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