Реализации на С++
Mediator
Общая реализация на языке С++
class Mediator
{
protected:
list<shared_ptr<Colleague>> colleagues;
public:
virtual ~Mediator() = default;
virtual bool send(const Colleague* coleague, shared_ptr<Message> msg) = 0;
static bool add(shared_ptr<Mediator> mediator, initializer_list<shared_ptr<Colleague>> list)
{
if (!mediator || list.size() == 0) return false;
for (auto elem : list)
{
mediator->colleagues.push_back(elem);
elem->setMediator(mediator);
}
return true;
}
};class ConcreteMediator : public Mediator
{
public:
virtual bool send(const Colleague* coleague, shared_ptr<Message> msg) override
{
bool flag = false;
for (auto& elem : colleagues)
{
if (dynamic_cast<const ColleagueLeft*>(colleague) && dynamic_cast<ColleagueRight*>(elem.get()))
{
elem->receive(msg);
flag = true;
}
else if (dynamic_cast<const ColleagueRight*>(colleague) && dynamic_cast<ColleagueLeft*>(elem.get()))
{
elem->receive(msg);
flag = true;
}
}
return flag;
}
};class Colleague
{
private:
weak_ptr<Mediator> mediator;
public:
virtual ~Colleague() = default;
void setMediator(shared_ptr<Mediator> mdr)
{
mediator = mdr;
}
virtual bool send(shared_ptr<Message> msg);
virtual void receive(shared_ptr<Message> msg) = 0;
};class ColleagueLeft : public Colleague
{
public:
virtual void receive(shared_ptr<Message> msg) override
{
cout << "Right - > Left;" << endl;
}
};class ColleagueRight : public Colleague
{
public:
virtual void receive(shared_ptr<Message> msg) override
{
cout << "Left - > Right;" << endl;
}
};class Message {}; # include <iostream>
# include <memory>
# include <list>
# include <vector>
using namespace std;
int main()
{
shared_ptr<Mediator> mediator = make_shared<ConcreteMediator>();
shared_ptr<Colleague> col1 = make_shared<ColleagueLeft>();
shared_ptr<Colleague> col2 = make_shared<ColleagueRight>();
shared_ptr<Colleague> col3 = make_shared<ColleagueLeft>();
shared_ptr<Colleague> col4 = make_shared<ColleagueLeft>();
Mediator::add(mediator, { col1, col2, col3, col4 });
shared_ptr<Message> msg = make_shared<Message>();
col1->send(msg);
col2->send(msg);
}Last updated
Was this helpful?