스테이트 패턴이란?
객체가 특정 상태에 따라 행위를 달리하는 상황에서, 상태를 조건문으로 검사해서 행위를 달리하는 것이 아닌, 상태를 객체화 하여 상태가 행동을 할 수 있도록 위임하는 패턴을 말한다.
객체 지향 프로그래밍에서의 클래스는 꼭 사물 / 생물만을 표현하는 고체 형태의 데이터만 표현 할 수 있는게 아니다. 경우에 따라서 무형태의 행위 / 동작도 클래스로 묶어 표현할 수 있다.
그래서 상태를 클래스로 표현하면 클래스를 교체해서 ‘상태의 변화’를 표현할 수 있고, 객체 내부 상태 변경에 따라 객체의 행동을 상태에 특화된 행동들로 분리해 낼 수 있으며, 새로운 행동을 추가하더라도 다른 행동에 영향을 주지 않는다.
스테이트 패턴 구조
사용자가 관심 있는 인터페이스를 정의한다.
객체의 각 상태를 정의한 State의 구현체 인스턴스를 관리한다.
Context의 각 상태별 행동을 정의한다.
스테이트 패턴 코드
public interface ElevatorState {
public void pushUpButton();
public void pushDownButton();
public void pushStopButton();
}
public class UpState implements ElevatorState {
private static UpState upState;
private UpState() {}
public static UpState getInstance() {
if (upState == null) {
upState = new UpState();
}
return upState;
}
@Override
public void pushUpButton() {
System.out.println("동작 없음");
}
@Override
public void pushDownButton() {
System.out.println("내려감");
}
@Override
public void pushStopButton() {
System.out.println("멈춤");
}
}
public class DownState implements ElevatorState {
private static DownState downState;
private DownState() {}
public static DownState getInstance() {
if (downState == null) {
downState = new DownState();
}
return downState;
}
@Override
public void pushUpButton() {
System.out.println("올라감");
}
@Override
public void pushDownButton() {
System.out.println("동작 없음");
}
@Override
public void pushStopButton() {
System.out.println("멈춤");
}
}
public class StopState implements ElevatorState {
private static StopState stopState;
private StopState() {}
public static StopState getInstance() {
if (stopState == null) {
stopState = new StopState();
}
return stopState;
}
@Override
public void pushUpButton() {
System.out.println("올라감");
}
@Override
public void pushDownButton() {
System.out.println("내려감");
}
@Override
public void pushStopButton() {
System.out.println("동작 없음");
}
}
public class AdaptElevator {
private ElevatorState elevatorState;
public AdaptElevator() {
this.elevatorState = StopState.getInstance();
}
public void setElevatorState(ElevatorState state) {
this.elevatorState = state;
}
public void pushUpButton() {
elevatorState.pushUpButton();
this.setElevatorState(UpState.getInstance());
}
public void pushDownButton() {
elevatorState.pushDownButton();
this.setElevatorState(DownState.getInstance());
}
public void pushStopButton() {
elevatorState.pushStopButton();
this.setElevatorState(StopState.getInstance());
}
}
public class Client {
public static void main(String[] args) {
AdaptElevator elevator = new AdaptElevator();
elevator.pushStopButton();
elevator.pushDownButton();
elevator.pushStopButton();
elevator.pushUpButton();
elevator.pushStopButton();
elevator.pushUpButton();
elevator.pushUpButton();
}
}
print >>>
동작 없음
내려감
멈춤
올라감
멈춤
올라감
동작 없음
[디자인 패턴] 스테이트(상태) 패턴 (State Pattern)
💠 상태(State) 패턴 - 완벽 마스터하기