일련의 규칙에 따라 객체의 상태(State)를 변화시켜, 객체가 할 수 있는 행위를 바꾸는 패턴
객체의 특정 상태를 클래스로 선언하고, 클래스에서는 해당 상태에서 할 수 있는 행위들을 메서드로 정의한다
형광등 만들기
State.class
public interface State{
void on_button_pushed(Light light);
void off_button_pushed(Light light);
}
ON.class
public class ON implements State{
private static ON on = new ON(); // ON 클래스의 인스턴스로 초기화됨
private ON() { }
public static ON getInstance() { // 초기화된 ON 클래스의 인스턴스를 반환함
return on;
}
public void on_button_pushed(Light light){ // ON 상태일 때 On 버튼을 눌러도 변화 없음
System.out.println("반응 없음");
}
public void off_button_pushed(Light light){
light.setState(OFF.getInstance());
System.out.println("Light Off!");
}
}
OFF.class
public class OFF implements State{
private static OFF off = new OFF();
private OFF() { }
public static OFF getInstance() {
return off;
}
public void on_button_pushed(Light light){
light.setState(ON.getInstance());
System.out.println("Light On!");
}
public void off_button_pushed(Light light){
System.out.println("반응 없음");
}
}
Light.class
public class Light{
private State state;
public Light(){
state = OFF.getInstance();
}
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);
}
}
Main.class
public static void main(String[] args) {
Light light = new Light();
light.on_button_pushed();
light.on_button_pushed();
light.off_button_pushed();
light.off_button_pushed();
}
실행결과
>>>Light On!
>>>반응 없음
>>>Light Off!
>>>반응 없음
참조: