728x90

1. 명령 패턴 ( Command Pattern ) 정의

  • 함수 호출을 객체로 감싸는 것이다.

 

2. 함수를 직접 호출하는 코드

// Jump(), FireGun() 등 함수를 직접 호출하는 방식의 코드
void InputHanler::HandleInput()
{
	if      ( IsPressed( ButtonX ) ) Jump();
	else if ( IsPressed( ButtonY ) ) FireGun();
}
  • 함수를 직접 호출하는 경우 코드를 이해하기는 쉽지만, 입력 키 변경이 불가능하다.

 

3. 명령 패턴을 이용하여 객체화

// 공통 상위 클래스 정의
class Command
{
public:
	virtual ~Command() {}
	virtual void Execute() = 0;
};

// Jump() 함수 호출을 객체화
class JumpCommand : public Command
{
public:
	virtual void Execute() { Jump(); }
};

// FireGun() 함수 호출을 객체화
class FireGunCommand : public Command
{
public:
	virtual void Execute() override { FireGun(); }
};

 

4. 함수를 직접 호출하는 코드 대신, 객체화된 소스 호출

class InputHandler
{
public:
	void HandleInput();

private:
	Command* ButtonX;
	Command* ButtonY;
};

void InputHandler::HandleInput()
{
	if      ( IsPressed( BUTTON_X ) ) ButtonX->Execute();
	else if ( IsPressed( BUTTON_Y ) ) ButtonY->Execute();
}

 

  • ButtonX, ButtonY에 어떤 버튼을 할당하느냐에 따라 호출되는 함수가 변경된다.
  • 함수를 직접 호출하는 코드와 달리, 입력 키 변경이 가능하다.
  • 전역 함수만 호출하도록 된 소스이므로, 액터 지시를 통해 단점 보완이 필요하다.

 

5. 액터에게 지시하기

// 공통 상위 클래스 정의
class Command
{
public:
	virtual ~Command() {}
	virtual void Execute( GameActor& InActor ) = 0;
};

// Jump() 함수 호출을 객체화
class JumpCommand : public Command
{
public:
	virtual void Execute( GameActor& InActor ) { InActor.Jump(); }
};

// FireGun() 함수 호출을 객체화
class FireGunCommand : public Command
{
public:
	virtual void Execute( GameActor& InActor ) override { InActor.FireGun(); }
};

// 입력한 버튼에 대한 명령 객체 반환.
Command* InputHandler::HandleInput()
{
	if      ( IsPressed( BUTTON_X ) ) return ButtonX;
	else if ( IsPressed( BUTTON_Y ) ) return ButtonY;

	// 키 입력이 없는 경우
	return nullptr;
}
	// 명령 객체를 반환받아 액터에게 행동을 지시한다.
	Command* command = inputHandler.HandleInput();
	if ( command )
		command->Execute( actor );
  • HandleInput() 함수를 통해 명령 객체를 반환받아, 특정 액터가 명령을 실행할 수 있도록 한다.
반응형

+ Recent posts