1. 상태 패턴

상태 패턴은 상태가 하나의 클래스가 되어
해당 상태일 때 각 동작들을 어떻게 처리할지 정의하고
다른 클래스는 상태에 의존하여 각 행동(격발, 스왑, 재장전)의 역할을 위임하는 패턴을 의미한다.
2. 상태 패턴은 언제 사용될까?
switch(CurrentState)
{
case Idle: // ...
case Attacking: // ...
case Reloading: // ...
case Stunned: // ...
case Rolling: // ...
case Aiming: // ...
}
위는 상태 분기 방식의 코드이다.
상태가 적을 경우 코드가 간단하여 빠르게 구현 가능하며
디버깅 시 상태별 분기가 한 곳에 모여 있어 추적하기 쉽다.
그러나 상태가 많아질수록 switch나 if-else 블록이 커지고 가독성이 저하될 수 있다.
상태가 많아지고
상태별 처리해야할 로직들이 많아진다면 상태 패턴을 고려해 볼 수 있다.
3. 상태 패턴 구조
class DoorState
{
public:
virtual void Open(Door& door) = 0;
virtual void Close(Door& door) = 0;
}
class OpenState : public DoorState
{
public:
virtual void Open(Door& door) override
{
// "이미 문이 열려 있습니다."
}
virtual void close(Door& door) override
{
// "문을 닫았습니다."
door.setState(new CloseState());
}
}
class CloseState : public DoorState
{
public:
virtual void Open(Door& door) override
{
// "문을 열었습니다."
door.setState(new OpenState());
}
virtual void close(Door& door) override
{
// "이미 문이 닫혀 있습니다."
}
}
class Door
{
public:
Door()
{
State = new CloseState();
}
void SetState(DoorState NewState)
{
State = NewState;
}
void Open()
{
State->Open();
}
void Close()
{
State ->Close();
}
private:
UDoorState* State;
}
{
...
Door door;
door.Open(); // 문을 열었습니다.
door.Open(); // 이미 문이 열려있습니다.
door.Close(); // 문을 닫았습니다.
door.Close(); // 이미 문을 닫았습니다.
}
- 상태가 주체가 되어 (클래스가 되어) 상태의 따른 행동을 정의한다.
- 각 상태별 행동에 따른 로직을 구분할 수 있다
- 다른 클래스(Door)는 상태 클래스(DoorState)에 의존하여 각 행동을 처리한다.
'Design Pattern' 카테고리의 다른 글
| [Design Pattern] 옵저버 패턴 (0) | 2025.04.15 |
|---|---|
| [Design Pattern] 커맨드 패턴 (Command Pattern) (0) | 2025.04.14 |
| [Design Pattern] 퍼사드 패턴 (Facade) (0) | 2025.04.11 |
| [Design Pattern] 프록시 패턴 (Proxy Pattern) (0) | 2025.04.10 |
| [Design Pattern] 어댑터 패턴 (Adapter Pattern) (0) | 2025.04.09 |