게임이 아니여도 명령패턴은 정말 다양한 분야에서 사용되고 있다.

명령 패턴은 메서드(함수) 호출을 실체화 한 것이다.

입력키 변경 및 실행

image.png

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;
};

image.png