반응형
State Pattern (상태 패턴)목적
객체(Context)가 가질 수 있는 (유한한)상태를 추상화하여 런타임에 상태를 유연하게 변경하도록 한다.
UML상 전략패턴과 거의 동일하지만 실제로 다른점은 전략패턴의 경우 사용하는 쪽에서 직접 알고리즘을 교체하지만 상태패턴은 사용하는 쪽에서 내부의 상태가 어떻게 바뀌는지 모른다.
FSM(Finite State Machine)을 구현하기에 적합한 패턴이다.
사용 시나리오
- 전구 상태를 표현하는 시스템이 있다.
- 전구의 상태는 켜짐과 꺼짐 두개가 존재하며 on/off 버튼을 통해 상태가 변한다.
- 꺼진 상태 -> on 버튼 -> 켜짐 -> on 버튼 -> 동작 안함
- 켜진 상태 -> off 버튼 -> 꺼짐 -> off 버튼 -> 동작 안함
[Context]
class LightContext {
public:
LightContext();
void chageState(State* newState);
void onPushedRequest();
void offPushedRequest();
private:
State* currentState;
};
LightContext::LightContext() {
currentState = OffState::getInstance();
}
void LightContext::chageState(State* newState) {
currentState = newState;
}
void LightContext::onPushedRequest() {
currentState->OnPushedHandle(this);
}
void LightContext::offPushedRequest() {
currentState->OffPushedHandle(this);
}
[State]
class State {
public:
virtual ~State(){}
virtual void OnPushedHandle(LightContext* lightContext) = 0;
virtual void OffPushedHandle(LightContext* lightContext) = 0;
};
[Concrete State Off]
class OffState : public State {
public:
static State* getInstance() {
static OffState offState;
return &offState;
}
virtual void OnPushedHandle(LightContext* lightContext) override;
virtual void OffPushedHandle(LightContext* lightContext) override;
};
void OffState::OnPushedHandle(LightContext* lightContext) {
cout<<"Turn On the light"<<endl;
lightContext->chageState(OnState::getInstance());
}
void OffState::OffPushedHandle(LightContext* lightContext) {
cout<<"Already Off"<<endl;
}
[Concrete State On]
class OnState : public State {
public:
static State* getInstance() {
static OnState onState;
return &onState;
}
virtual void OnPushedHandle(LightContext* lightContext);
virtual void OffPushedHandle(LightContext* lightContext);
};
void OnState::OnPushedHandle(LightContext* lightContext) {
cout<<"Already On"<<endl;
}
void OnState::OffPushedHandle(LightContext* lightContext) {
cout<<"Turn Off the light"<<endl;
lightContext->chageState(OffState::getInstance());
}
[Client]
int main(int argc, const char * argv[]) {
LightContext* light = new LightContext();
light->onPushedRequest();
light->onPushedRequest();
light->offPushedRequest();
light->offPushedRequest();
return 0;
}
실행결과
Turn On the light
Already On
Turn Off the light
Already Off
반응형
'Design Patterns > Behavioral Patterns' 카테고리의 다른 글
Visitor Pattern (C++) (0) | 2020.01.05 |
---|---|
Memento Pattern (C++) (0) | 2019.12.30 |
Mediator Pattern (C++) (0) | 2019.12.29 |
Command Pattern (C++) (0) | 2019.12.22 |
Chain of Responsibility Pattern (C++) (0) | 2019.12.15 |