JAVA/DesignPattern

Design Pattern 디자인 패턴 State Pattern 상태 패턴

호두밥 2021. 12. 29. 22:50

State Pattern 상태 패턴

행동 패턴으로, 상태변화에 따라 클래스의 행동을 바꾸는 패턴입니다.

상태 패턴에서는 다양한 상태를 나타내는 객체와 상태 객체가 변경됨에 따라 동작이 달라지는 컨텍스트 객체를 생성합니다.

State Pattern 상태 패턴 사용이 적합한 경우

  • 현재 상태에 따라 행동(기능)이 변화되는 객체인 경우, 상태의 가짓수가 많고, 상태가 빈번하게 변경되는 경우
  • 클래스의 상태 필드에 따라서 기능을 변경하는, 수많은 조건문으로 코드가 복잡해진 경우
  • 상태 필드를 변경하는 조건 코드가 많이 중복해서 사용되고 있는 경우

장단점

장점

  • 상태를 관리하는 로직을 클래스 객체에서 분리해 관리할 수 있습니다. (단일책임원칙)
  • 기존 상태 클래스와 컨텍스트 객체의 수정 없이 새로운 상태를 추가할 수 있습니다. (개방/폐쇄원칙)
  • 상태를 관리하기 위한 조건 코드를 간단하게 만들 수 있습니다.

단점

  • 상태의 가짓수가 적고, 상태 변경도 드물다면, 상태 패턴을 적용하는 것은 과도할 수 있습니다.

 

State Pattern 상태 패턴 구현

상태를 표현하는 객체인 State를 생성합니다. 그리고 상태 객체를 포함하면서 상태객체가 변경될때마다 동작이 달라지는 컨텍스트 객체를 생성합니다. 

State

public interface State {
    void execute(Context context);
}

Play

public class Play implements State {
    @Override
    public void execute(Context context) {
        System.out.println("State set play");
        context.setState(this);
    }
}

Pause

public class Pause implements State {
    @Override
    public void execute(Context context) {
        System.out.println("State set pause");
        context.setState(this);
    }
}

Context

public class Context {
    private State state;

    public Context() {
        this.state = null;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}

Main

public class Main {
    public static void main(String[] args) {
        Context context = new Context();
        State play = new Play();
        play.execute(context);
        System.out.println("context state = " + context.getState().getClass().getName());

        State pause = new Pause();
        pause.execute(context);
        System.out.println("context state = " + context.getState().getClass().getName());
    }
}
State set play
context state = javatest.designPattern.state.Play
State set pause
context state = javatest.designPattern.state.Pause

참조