본문 바로가기
디자인 패턴/[ecourse] C++ Design Pattern

4. State Pattern

by 헛둘이 2023. 2. 10.

어떤 게임을 예로 들면,

캐릭터가 있고, 캐릭터가 아이템을 획득해서 공격 방식과 이동 속도가 변한다고 가정한다.

 

그걸 캐릭터 코드에서 해결한다고 하면 아래와 같이 투박하게 처리가 가능할 것이다.

 

class Character
{
public:
    void Attack() {
    	if ( normal ) ...
        if ( item ) ...
    }
    
    void Run() {
        if ( normal ) ...
        if ( item ) ...
    }
private:

}

- 그러나 이렇게 처리하면 모든 아이템에 대해 if 분기문을 걸어줘야 하며,

- 기존 코드를 손봐야 하는 문제가 생긴다. (OCP 위반)

 

이는 상태 패턴을 사용해서 아래와 같이 처리할 수 있다.

struct IState
{
    virtual void Attack() = 0;
    virtual void Run() = 0;
    virtual ~IState() { }
}

class ItemState : public IState
{
public:
    virtual void Attack() { ... }
    virtual void Run() { ... }
}


class Character
{
public:
    void Attack() {
    	pState->Attack();
    }
    
    void Run() {
        pState->Run();
    }
private:
    IState* pState;
}

- 상태 패턴의 다이어그램은 전략 패턴의 다이어그램과 완벽히 동일하다

- 다만 개념적으로 다른 것은 전략 패턴을 알고리즘을 바꾸는 거고,

- 상태 패턴은 동작 전체를 바꾸므로 의미상으로는 차이가 있다.

댓글