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 클래스의 인스턴스로 객체의 공유 가능

Updated:

Leave a comment