State

GamSa Ham·2022년 11월 10일
0

GoF디자인패턴

목록 보기
15/22

의도

객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게 허가하는 패턴, 이렇게 하면 객체는

마치 자신의 클래스를 바꾸는 것처럼 보입니다.

활용성

  • 객체의 행동이 상태에 따라 달라질 수 있고, 객체의 상태에 따라서 런타임에 행동이 바뀔 때
  • 객체의 상태에 따라 달라지는 다중 분기 조건 처리가 너무 많이 들어 있을 때, 객체의 상태를 표현하기 위해 상태를 하나 이상의 나열형 상수로 정의해야 하고, 동일한 조건 문장들을 하나 이상의 연산에 중복 정의해야 한다. 이때, 객체의 상태를 별도의 객체로 정의하면, 다른 객체들과 상관없이 그 객체의 상태를 다양화시킬 수 있다.

구조

참여자

  • Context: 사용자가 관심 있는 인터페이스를 정의합니다. 객체의 현재 상태를 정의한 ConcreteState 서브클래스의 인스턴스를 유지, 관리
  • State: Context의 각 상태별로 필요한 행동을 캡슐화하여 인터페이스로 정의
  • ConcreteState: 각 서브클래스들은 Context의 상태에 따라 처리되어야 할 실제 행동을 구현

예제코드

public interface State {

    void on_button(Light light);

    void off_button(Light light);
}

public class ON implements State {

    @Override
    public void on_button(Light light) {
        //light.setState(new Sleep());
    }

    @Override
    public void off_button(Light light) {
        light.setState(new OFF());
    }
}

public class OFF implements State {

    @Override
    public void on_button(Light light) {
        light.setState(new ON());
    }

    @Override
    public void off_button(Light light) {
    }
}

//추가
public class Sleep implements State {

    @Override
    public void on_button(Light light) {
        light.setState(new ON());
    }

    @Override
    public void off_button(Light light) {
        light.setState(new OFF());
    }
}
public class Light {
    private State state;

    public Light() {
        state = new OFF();
    }

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

    public void on_button() {
        state.on_button(this);
    }

    public void off_button() {
        state.off_button(this);
    }
}
profile
안녕하세요. 자바를 좋아하고 디자인 패턴, Refactoring, Clean Code에 관심이 많은 백엔드 개발자입니다.

0개의 댓글