본문 바로가기
CS(Computer Science)지식/[C++] 디자인 패턴

상태 패턴(State Pattern)이해하기 : 쉽게 설명한 디자인 패턴(C++)

by 엔지니어 청년 2024. 1. 29.

상태 패턴(State Pattern)이란?


상태 패턴은 객체의 내부 상태에 따라 여러 행동을 캡슐화하는 디자인 패턴입니다. 이 패턴을 사용하면 객체의 클래스를 변경하지 않고도 객체의 행동을 변경할 수 있습니다. 상태 패턴은 객체가 내부 상태에 따라 행동을 변경해야 할 때 유용합니다.

상태 패턴은 세 가지 주요 구성 요소로 이루어져 있습니다:

  1. Context: 사용자에게 유용한 인터페이스를 제공하고, 현재 상태를 정의하는 객체입니다.
  2. State: 모든 특정 상태의 행동을 캡슐화하는 인터페이스입니다.
  3. ConcreteState: State 인터페이스를 구현하는 서브클래스로, 특정 상태의 행동을 제공합니다.

예시 코드


다음은 C++로 작성된 간단한 상태 패턴의 예입니다:

#include <iostream>

// State
class State {
public:
    virtual ~State() = default;
    virtual void handleRequest() = 0;
};

// Concrete States
class ConcreteStateA : public State {
public:
    void handleRequest() override {
        std::cout << "Handling request by ConcreteStateA.\n";
    }
};

class ConcreteStateB : public State {
public:
    void handleRequest() override {
        std::cout << "Handling request by ConcreteStateB.\n";
    }
};

// Context
class Context {
public:
    Context(State* state) : state(state) {}

    void setState(State* newState) {
        state = newState;
    }

    void request() {
        state->handleRequest();
    }

private:
    State* state;
};

int main() {
    ConcreteStateA stateA;
    ConcreteStateB stateB;

    Context context(&stateA);

    context.request();  // Output: Handling request by ConcreteStateA.

    context.setState(&stateB);
    context.request();  // Output: Handling request by ConcreteStateB.

    return 0;
}

위 코드에서 Context는 사용자에게 유용한 인터페이스를 제공하고, 현재 상태를 정의하는 객체입니다. State는 모든 특정 상태의 행동을 캡슐화하는 인터페이스입니다. ConcreteStateAConcreteStateBState 인터페이스를 구현하는 서브클래스로, 특정 상태의 행동을 제공합니다.

    +-----------------+
    |      State      |
    +-----------------+
    | handleRequest() |
    +-----------------+
            ^
            |
    +-----------------+     +-----------------+
    | ConcreteStateA  |     | ConcreteStateB  |
    +-----------------+     +-----------------+
    | handleRequest() |     | handleRequest() |
    +-----------------+     +-----------------+
            ^                       ^
            |                       |
    +-----------------+
    |     Context     |
    +-----------------+
    | setState()      |
    | request()       |
    +-----------------+

이 패턴을 사용하면 객체의 상태에 따라 행동을 쉽게 변경할 수 있습니다. 하지만 이 패턴을 사용하면 코드가