어떤 게임을 예로 들면,
캐릭터가 있고, 캐릭터가 아이템을 획득해서 공격 방식과 이동 속도가 변한다고 가정한다.
그걸 캐릭터 코드에서 해결한다고 하면 아래와 같이 투박하게 처리가 가능할 것이다.
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;
}
- 상태 패턴의 다이어그램은 전략 패턴의 다이어그램과 완벽히 동일하다
- 다만 개념적으로 다른 것은 전략 패턴을 알고리즘을 바꾸는 거고,
- 상태 패턴은 동작 전체를 바꾸므로 의미상으로는 차이가 있다.
'디자인 패턴 > [ecourse] C++ Design Pattern' 카테고리의 다른 글
3. Template Method & Strategy Pattern (0) | 2023.02.09 |
---|---|
2. 인터페이스와 커플링 (0) | 2023.02.08 |
1. protected 생성자 & 소멸자 (0) | 2023.02.08 |
댓글