#include #include #include using namespace std; // The interface for communication between back and front class Command { public: virtual bool execute() = 0; virtual void undo() = 0; }; // Reciever, which is a backend class Light { int status; public: Light() : status(0) {} bool on() { if (status == 0) { status = 1; cout << "Light on" << endl; return true; } else { cout << "Light is already on" << endl; return false; } } bool off() { if (status == 1) { status = 0; cout << "Light off" << endl; return true; } else { cout << "Light is already off" << endl; return false; } } int get_status() { return status; } }; class OffCommand : public Command { shared_ptr l; public: OffCommand(shared_ptr l) : l(l) {} bool execute() override { return l->off(); } void undo() override { l->on(); } }; class OnCommand : public Command { shared_ptr l; public: OnCommand(shared_ptr l) : l(l) {} bool execute() override { return l->on(); } void undo() override { l->off(); } }; // The Invoker: manages and executes all commands. // Any class that wants to operate the light can do so by simply // executing a command, without needing to know the internal details // of how the light works. class RemoteControl { vector> cmds; public: RemoteControl() {} void exec_command(shared_ptr cmd) { if (cmd->execute()) { cmds.push_back(cmd); } } void undo() { if (cmds.size() != 0) { cmds[cmds.size() - 1]->undo(); cmds.pop_back(); } } }; int main() { auto l = make_shared(); auto c1 = make_shared(l); auto c2 = make_shared(l); RemoteControl rc; rc.exec_command(c1); rc.exec_command(c1); rc.exec_command(c2); rc.undo(); }