커맨드 패턴은 요청을 객체로 캡슐화하여 관리하는 패턴이다.
보통 커맨드 패턴을 설명할 때 리모컨을 예시로 많이 드는편이다.
우리가 TV나 에어컨을 리모컨으로 켜고 끌 때 굳이 리모컨이 아니더라도 각종 복잡한 전자기기의 버튼을 눌러서 우리가 원하고자하는 기능을 동작시킨다.
이 때 사용자입장에서는 그 버튼이 어떤 원리로 기기를 동작시키는지는 알 필요가 없다. 단순히 '버튼을 누른다'라는 행위만 알고 있으면 된다. TV를 켜기위해서 리모컨이 버튼을 누를때 리모컨 내부의 어떤 모듈이 특정한 신호를 TV로 보내서 . . . 이런 복잡한 이론을 다 알고있는 상태로 버튼을 누르는게 아니지않은가?
커맨드 패턴은 요청을 즉, 우리가 기대하고자하는 동작을 캡슐화로 은닉화하는 전략이다. "복잡하게 생각할거없고 이거 한방만 누르면 다 해결됩니다!" 같은 느낌?
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Command {
public:
virtual void execute(void) = 0;
virtual ~Command(void) {};
};
class GraphicDevice : public Command {
public:
GraphicDevice() {
}
void execute() {
cout << "Exectue GraphicDevice Command" << endl;
}
private:
};
class SoundDevice : public Command {
public:
SoundDevice() {
}
void execute(void) {
cout << "Exectue SoundDevice Command" << endl;
}
private:
};
class IODevice : public Command {
public:
IODevice() {
}
void execute(void) {
cout << "Exectue IODevice Command" << endl;
}
private:
};
class CmdList {
public:
void add(Command* c) {
commands.push_back(c);
}
void executeCommandList(void) {
for (vector<Command*>::size_type x = 0; x < commands.size(); x++) {
commands[x]->execute();
}
}
private:
vector<Command*> commands;
};
int main(void) {
CmdList list;
SoundDevice soundDevice;
GraphicDevice graphicDevice;
IODevice ioDevice;
//Create Recipe
list.add(&soundDevice);
list.add(&graphicDevice);
list.add(&ioDevice);
list.executeCommandList();
return 0;
}
