[디자인 패턴] #1_명령 패턴, Command pattern
게임 디자인 패턴 중 "명령 패턴(Command Pattern)"에 대해 알아보겠습니다.
"게임 프로그래밍 패턴"의 2 항목, "명령"에 해당하는 내용입니다.
커맨드 패턴, 명령 패턴, Command Pattern
"명령 패턴"은 메서드 호출을 실체화한 것입니다.
이때, "실체화"는 실제 하는 것으로, 즉 어떤 개념을 객체화하는 것을 의미합니다.
이해하기 상당히 어렵죠...
예제를 통해 살펴보겠습니다.
입력키 변경, 특정 동작 실행
void InputHandler::handleInput()
{
if(isPressed(Button_Q)) ThrowFire();
else if(isPressed(Button_W)) MakeShield();
else if(isPressed(Button_E)) HardPunch();
else if(isPressed(Button_R)) HardKick();
}
키보드 입력에 따라서 수행할 동작들을 나타내는 InputHandler 클래스의 handleInput() 메서드의 내용입니다.
보시다시피 키보드의 "Q"를 누를 경우 불을 발사하고, "W", "E", 그리고 "R"까지 각각 특정 동작들을 수행합니다.
알다시피, 많은 게임들은 키 입력을 변경할 수 있도록 지원합니다.
따라서, 우리는 특정 동작 함수를 직접 호출하는 방법을 "명령 패턴"을 활용해 다른 방법으로 교체해보겠습니다.
class InputHandler
{
public:
void handleInput();
private:
Command* buttonQ_;
Command* buttonW_;
Command* buttonE_;
Command* buttonR_;
};
Command* InputHandler::handleInput()
{
if(isPressed(BUTTON_Q))
return buttonQ_;
// W, E, R 동일
}
class Command
{
public:
virtual ~Command();
virtual void exectue(GameActor& actor) = 0; // 순수 가상 함수 : 하위 클래스에서 필수적으로 정의해야합니다!!
};
class ThrowFireCommand : public Command
{
public:
virtual void execute(GameActor& actor) {actor.ThrowFire(); }
};
class MakeShieldCommand : public Command
{
public:
virtual void execute(GameActor& actor) { actor. MakeShield(); }
};
class HardPunchCommand : public Command
{
public:
virtual void execute(GameActor& actor) { actor.HardPunch(); }
};
class HardKickCommand : public Command
{
public:
virtual void execute(GameActor& actor) { actor.HardKick(); }
};
int main()
{
Command* command = InputHandler::handleInput();
if(command)
command->execute(actor);
}
위 코드 예제는 "ThrowFire()" 메서드를 "Command"라는 상위 클래스와 함께 "ThrowFireCommand" 하위 클래스 내부 "exectue()" 멤버 함수의 본문에서 호출하도록 하고 있습니다.
추가적으로, 특정 동작을 수행시킬 게임 내부의 액터를 인자로 받고 특정 액터에게 특정 동작을 수행할 수 있도록 하고 있습니다.
보시다시피, "명령 패턴"은 "명령" 혹은 특정 "행위"를 객체화하고 있죠!
명령 패턴은 메서드 호출을 실체화한 것이다,
즉 서로 다른 메서드 사용자들을 매개변수로 받고, 명령 요청(메서드 호출)을 객체로 감싸서 객체지향화합니다.
'언어 > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴]#6_상태 패턴, State Pattern (1) | 2022.08.20 |
---|---|
[디자인 패턴]#5_싱글턴 패턴, Singleton Pattern (0) | 2022.08.02 |
[디자인 패턴]#4_프로토타입 패턴, Prototype Pattern (0) | 2022.07.22 |
[디자인 패턴]#3_관찰자 패턴, Observer Pattern (0) | 2022.07.15 |
[디자인 패턴]#2_경량 패턴, Flyweight Pattern (0) | 2022.07.10 |