[디자인 패턴][행동 패턴] 상태 패턴(State Pattern)
Updated:
1. 개요
객체의 상태에 따라 스스로 행동을 변경할 수 있도록 하는 패턴
상태 패턴(State Pattern)은 행동 패턴(Behavioral Pattern)의 한 종류로, 객체의 특정 상태를 클래스로 추상 클래스로 선언하고, 서브 클래스에서 각각의 상태에서 할 수 있는 행위들을 구현하여 자신이 직접 행위를 호출하는 것이 아닌 상태가 행동을 할 수 있도록 위임하는 패턴이다.
2. 행동 패턴(Behavioral Pattern)
2-1. 행동 패턴이란?
행동 패턴이란 처리의 책임을 어떤 객체에게 할당하는 것이 좋은지, 알고리즘을 어떤 객체에 정의하는 것이 좋은지 등의 책임 분배와 관련된 패턴이다.
2-2. 행동 패턴 종류
3. 구성
[출처 : GoF의 디자인 패턴]
-
Context : 현재의 상태를 나타내는 클래스
-
State : Context의 상태별 행동을 정의한 인터페이스
-
ConcreteState : State 인터페이스 구현체
4. 예제 코드
특정 사이트에 회원가입을 할 때, 먼저 페이지에 방문을 한 후 가입이 진행되어야 한다. 방문 이후 가입하는 과정을 코드로 구현해보자.
4-1. Context
[Context.java]
1
2
3
4
5
6
7
8
9
10
11
12
public class Context {
private State state;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
4-2. State
[State.java]
1
2
3
4
public interface State {
void doAction(Context context);
}
4-3. ConcreteState
[VisitState.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
public class VisitState implements State {
@Override
public void doAction(Context context) {
System.out.println("ACTION : VISIT");
context.setState(this);
}
@Override
public String toString() {
return "NOW STATE : VISIT";
}
}
[JoinState.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
public class JoinState implements State {
@Override
public void doAction(Context context) {
System.out.println("State : JOIN");
context.setState(this);
}
@Override
public String toString() {
return "NOW STATE : JOIN";
}
}
5. 테스트
[Clinet.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Client {
public static void main(String[] args) {
Context context = new Context();
VisitState visitState = new VisitState();
visitState.doAction(context);
System.out.println(context.getState().toString());
JoinState joinState = new JoinState();
joinState.doAction(context);
System.out.println(context.getState().toString());
}
}
[실행 결과]
6. 특징
-
상태의 명확한 표현 : 상태별로 객체를 만들어 관리하므로 상태를 명확하게 표현 가능
-
상태 객체의 공유 : 상태를 객체로 표현하므로 여러 Context 클래스의 인스턴스로 객체의 공유 가능
Leave a comment