#include
#include
class Mediator {
public:
virtual void Notify(std::string Msg) = 0;
};
class BaseComponent {
public:
virtual void opt() = 0;
virtual void respond() = 0;
protected:
std::shared_ptr m = nullptr;
};
class ConcreteComponet1 : public BaseComponent {
public:
void opt() override {
std::cout << "In ConcreteComponet1 opt show()." << std::endl;
if(m) { m->Notify(std::string("One")); }
}
void respond() override { std::cout << "In ConcreteComponet1 respond()." << std::endl; }
void setMediator(std::shared_ptr m) { this->m = m; }
};
class ConcreteComponet2 : public BaseComponent {
public:
void opt() override {
std::cout << "In ConcreteComponet2 opt()." << std::endl;
if(m) { m->Notify("Two"); }
}
void respond() override { std::cout << "In ConcreteComponet2 respond()." << std::endl; }
void setMediator(std::shared_ptr m) { this->m = m; }
};
class ConcreteMediator : public Mediator {
public:
ConcreteMediator(std::shared_ptr b1, std::shared_ptr b2) : b1(b1), b2(b2) { }
void Notify(std::string Msg) override {
if (Msg == "One") { b2->respond(); }
if (Msg == "Two") { b1->respond(); }
}
void setComponent(std::shared_ptr b1, std::shared_ptr b2){
this->b1 = b1;
this->b2 = b2;
}
private:
std::shared_ptr b1 = nullptr;
std::shared_ptr b2 = nullptr;
};
int main(int argc, char *argv[]) {
std::shared_ptr b1 = std::make_shared();
std::shared_ptr b2 = std::make_shared();
std::shared_ptr cm = std::make_shared(b1, b2);
b1->setMediator(cm);
b2->setMediator(cm);
b1->opt();
b2->opt();
return 1;
}