1. 스테이트 패턴 정의
상태에 따라 동일한 작업이 다른 방식으로 실행될 때 해당 상태가 작업을 수행하도록 위임하는 디자인 패턴
- 상태 : 객체가 시스템에 존재하는(객체의 라이프 타임) 동안 객체가 가질 수 있는 어떤 조건이나 상황
- 상태진입 : 객체의 한 상태에서 다른 상태로 이동하는 것
2. 스테이트 패턴 구현
- 객체의 특정 상태를 클래스로 선언
- 클래스에서는 해당 상태에서 할 수 있는 행위들을 메소드로 정의
- 각 상태 클래스를 인터페이스로 캡슐화 → 클라이언트에서 인터페이스를 호출하는 방식
1) 인터페이스 메소드 : 각 상태에서 수행해야 하는 행위
2) Context 요소 : 상태 클래스를 이용해 일을 수행 시키도록 지시 (현재 상태를 나타내는 state 변수 존재)
3) State1, State2, State3 : Context 가 요청한 작업을 자신의 방식으로 실제 실행 . Context 요소의 state 변수 변경 → 각 상태 클래스의 객체가 다음 상태 객체를 Context 요소를 구현한 클래스에 알려줌으로써 이루어짐
[ 예시 ]
interface State {
public void on_button_pushed(Light light);
public void off_button_pushed(Light light);
}
public class ON implements State {
public void on_button_pushed(Light light){
System.out.println("반응 없음");
}
public void off_button_pushed(Light light){
System.out.println("Light Off!");
light.setState(new OFF(light));
}
}
public class OFF implements State {
public void on_button_pushed(Light light){
System.out.println("Light ON!");
light.setState(new ON(light));
}
public void off_button_pushed(Light light){
System.out.println("반응 없음");
}
}
public class Light {
private State state;
public Light(){
state = new OFF();
}
public void setState(State state){
this.state = state;
}
public void on_button_pushed(){
state.on_button_pushed(this);
}
public void off_button_pushed() {
state.off_button_pushed(this);
}
}
전략 패턴과의 차이점
스테이트 패턴은 전략 패턴과 상당히 유사함. (거의 동일한 구조). 사용을 구분하자면, 전략 패턴은 상속을 대체하려는 목적으로, 스테이트 패턴은 코드내의 (복잡한)조건문들을 대체하려는 목적으로 사용함
'Design pattern' 카테고리의 다른 글
[Design Pattern] Observer Pattern (0) | 2022.08.04 |
---|---|
[Design Pattern] Command Pattern (0) | 2022.08.01 |
[Design Pattern] Singleton Pattern (0) | 2022.07.20 |
[Design Pattern] Strategy pattern (0) | 2022.07.13 |
[Design Pattern] SOLID 원칙 (0) | 2022.07.01 |