// command_example.cpp
#include <iostream>
#include <string>
using namespace std;
// interface Command
class Command {
public:
virtual void execute() = 0;
};
class NoCommand : public Command {
public:
void execute() {}
};
// class Invoker
//
// to invoke commands
//
class Invoker {
public:
Invoker() {
command = new NoCommand;
}
void setCommand(Command *command) {
this->command = command;
}
void doIt() {
command->execute();
}
private:
Command *command;
};
// Commands Receivers
class Receiver1 {
public:
void action() {
cout << "Receiver1 is in action." << endl;
}
};
class Receiver2 {
public:
void action1() {
cout << "Receiver2 is in action1." << endl;
}
void action2() {
cout << "Receiver2 is in action2." << endl;
}
};
// Commands
class Command1 : public Command {
public:
Command1(Receiver1 *receiver) {
this->receiver = receiver;
}
void execute() {
receiver->action();
}
private:
Receiver1 *receiver;
};
class Command2 : public Command {
public:
Command2(Receiver2 *receiver) {
this->receiver = receiver;
}
void execute() {
receiver->action1();
receiver->action2();
}
private:
Receiver2 *receiver;
};
int main(int argc, char **argv) {
Receiver1 *receiver1 = new Receiver1;
Receiver2 *receiver2 = new Receiver2;
Command1 *command1 = new Command1(receiver1);
Command2 *command2 = new Command2(receiver2);
Invoker invoker;
// invoker ready to give command1 to Receiver1.
invoker.setCommand(command1);
invoker.doIt();
// invoker ready to give command2 to Receiver2.
invoker.setCommand(command2);
invoker.doIt();
delete receiver1;
delete receiver2;
delete command1;
delete command2;
return 0;
}