#include <iostream>
#include <memory>
class Reciever {
public:
void op1() { std::cout << "In Reciever op1()." << std::endl; }
void op2() { std::cout << "In Reciever op2()." << std::endl; }
};
class Command {
public:
virtual void show() = 0;
void setReciever(std::shared_ptr<Reciever> r) { this->r = r; }
protected:
std::shared_ptr<Reciever> r = nullptr;
};
class ConcreteCommand1 : public Command {
public:
void show() override {
std::cout << "In ConcreteCommand1 show()." << std::endl;
r->op1();
}
};
class ConcreteCommand2 : public Command {
public:
void show() override {
std::cout << "In ConcreteCommand2 show()." << std::endl;
r->op2();
}
};
class Invoker {
public:
void show() {
c1->show();
c2->show();
}
void setCommand1(std::shared_ptr<Command> c1) { this->c1 = c1; }
void setCommand2(std::shared_ptr<Command> c2) { this->c2 = c2; }
private:
std::shared_ptr<Command> c1;
std::shared_ptr<Command> c2;
};
int main(int argc, char *argv[]) {
std::shared_ptr<Reciever> r = std::make_shared<Reciever>();
std::shared_ptr<Command> c1 = std::make_shared<ConcreteCommand1>();
std::shared_ptr<Command> c2 = std::make_shared<ConcreteCommand2>();
c1->setReciever(r);
c2->setReciever(r);
Invoker i;
i.setCommand1(c1);
i.setCommand2(c2);
i.show();
return 1;
}