게임이 아니여도 명령패턴은 정말 다양한 분야에서 사용되고 있다.
명령 패턴은 메서드(함수) 호출을 실체화 한 것이다.
A버튼은 무기를 바꾸는 동작
B 점프를 하는 동작을 실행
X는 총아을 발사하는 동작
Y 방패를 올리는 동작
위 패턴을 정말 간단하게 구현 예를 보자
class InputHandler
{
public:
void HandleInput()
{
if (isPressed(BUTTON_X)) Fire();
else if (isPressed(BUTTON_Y)) Defence();
else if (isPressed(BUTTON_A)) SwapWeapon();
else if (isPressed(BUTTON_X)) Jump();
}
//...
}
그래서 간단하게는 단순한 함수의 호출로 구현이 가능하다.
여기서 우리는 디자인패턴을 조금 더 깊게 공부하기 위해서 해당 함수에 실행되는 동작 하나하나를 하나의 클래스를 이용해서 객체로 바꾸어보자.
class Command
{
public:
virtual ~Command() {}
virtual void Execute() = 0;
};
class JumpCommand : public Command
{
public:
void Execute() override
{
std::cout << "Jump" << std::endl;
}
};
class FireCommand : public Command
{
public:
void Execute() override
{
std::cout << "Fire" << std::endl;
}
};
class InputHandler
{
public:
void HandleInput()
{
if (isPressed(BUTTON_X)) mButtonX->Execute();
else if (isPressed(BUTTON_Y)) mButtonY->Execute();
else if (isPressed(BUTTON_A)) mButtonA->Execute();
else if (isPressed(BUTTON_B)) mButtonB->Execute();
}
private:
Command* mButtonX;
Command* mButtonY;
Command* mButtonA;
Command* mButtonB;
};