프로그래밍/GoF

[행동 패턴] - 상태(State)

MAKGA 2022. 1. 8. 16:14
320x100

구조

#pragma once

#include <iostream>
#include <set>
#include <string>

class State
{
public:
    virtual void handle() = 0;
};

class Context
{
private:
    State* state_;

public:
    Context(State* state)
    {
        state_ = state;
    }

    void changeState(State* state)
    {
        state_ = state;
    }

    void request() {
        state_->handle();
    }
};

class StateA : public State
{
public:
    void handle() override
    {
        std::cout << "StateA";
    }
};

class StateB : public State
{
    void handle() override
    {
        std::cout << "StateB";
    }
};

 

사용

int main()
{
    StateA* stateA = new StateA;
    StateB* stateB = new StateB;
    Context* context = new Context(stateA);

    context->request();
    context->changeState(stateB);
    context->request();

    system("pause");

    return 0;
}

 

어느 객체(Context)가 상태 객체(State의 파생 클래스)를 멤버로 들고 있고, Context는 그저 멤버의 함수를 실행시키는 역할만 한다. 그 함수 안에 무슨 동작을 할지는 내부 State 객체가 어느 객체가 등록되어있는지에 따라 달라진다.

320x100