#include #include // The receiver. class Bulb { public: void turnOn(void) { std::cout << "Bulb has been lit." << std::endl; } void turnOff(void) { std::cout << "Darkness!" << std::endl; } }; class Command { public: virtual void execute(void) = 0; virtual void undo(void) = 0; virtual void redo(void) = 0; }; // A command. class TurnOn : public Command { public: TurnOn(std::shared_ptr bulb) : bulb_(bulb) { } void execute(void) { bulb_->turnOn(); } void undo(void) { bulb_->turnOff(); } void redo(void) { execute(); } private: std::shared_ptr bulb_; }; // Another command. class TurnOff : public Command { public: TurnOff(std::shared_ptr bulb) : bulb_(bulb) { } void execute(void) { bulb_->turnOff(); } void undo(void) { bulb_->turnOn(); } void redo(void) { execute(); } private: std::shared_ptr bulb_; }; // The invoker. class RemoteControl { public: void submit(std::shared_ptr command) { command->execute(); } }; int main() { std::shared_ptr bulb = std::make_shared(); std::shared_ptr turnOn = std::make_shared(bulb); std::shared_ptr turnOff = std::make_shared(bulb); RemoteControl remote; remote.submit(turnOn); remote.submit(turnOff); // Output: // Bulb has been lit. // Darkness! return 0; }