객체가 상태에 따라 행위를 달리하도록 하는 패턴. 상태가 행위를 하게한다. 동일한 동작을 객체의 상태에 따라 다르게 처리해야할 때 사용한다.
상태(State)를 인터페이스로 캡슐화한다. 내부에 상태에 따라 다르게 행동할 동작을 정의해준다.
public interface PowerState {
PowerState pushButton();
}
필요한 상태 객체들이 해당 State를 구현하게 만들어준다.
public class On implements PowerState {
@Override
public PowerState pushButton() {
System.out.println("전원이 꺼졌습니다.");
return new Off();
}
}
public class Off implements PowerState {
@Override
public PowerState pushButton() {
System.out.println("전원이 켜졌습니다.");
return new On();
}
}
객체는 State를 가지고 있으면서 State에 따라 동작이 달라지게 된다.
public class TV {
private PowerState state;
public TV() {
this.state = new Off();
}
public void pushButton() {
state = state.pushButton();
}
}
클라이언트에서 아래와 같이 사용할 수 있다.
public class Application {
public static void main(String[] args) {
TV tv = new TV();
tv.pushButton(); // 전원이 켜졌습니다.
tv.pushButton(); // 전원이 꺼졌습니다.
}
}
전략 패턴과 비슷한 구조이지만 전략 패턴은 상속을 대체하려는 목적, 상태 패턴은 조건문들을 대체하려는 목적으로 사용한다고 한다.