State
: 시스템의 모든 상태에 공통의 인터페이스를 제공한다. 따라서 이 인터페이스를 실체화한 어떤 상태 클래스도 기존 상태 클래스를 대신해 교체해서 사용할 수 있다.State1, State2, State3
: Context 객체가 요청한 작업을 자신의 방식으로 실제 실행한다. 대부분의 경우 다음 상태를 결정해 상태 변경을 Context 객체에 요청하는 역할도 수행한다.Context
: State를 이용하는 역할을 수행한다. 현재 시스템의 상태를 나타내는 상태 변수 (state)와 실제 시스템의 상태를 구성하는 여러 가지 변수가 있다. 또한 각 상태 클래스에서 상태 변경을 요청해 상태를 바꿀 수 있도록 하는 메서드(setState)가 제공된다. Context 요소를 구현한 클래스의 request 메서드는 실제 행위를 실행하는 대신 해당 상태 객체에 행위 실행을 위임한다.상태(state)
상태(state)
- 객체가 시스템에 존재하는 동안, 즉 객체의 라이프 타임 동안 객체가 가질 수 있는 어떤 조건이나 상황
- ex) 객체가 어떤 상태에 있는 동안 어떤 액티비티 등을 수행하거나 특정 이벤트 발생을 기다리는 것
- 시작 상태: 객체가 시작하는 처음 상태
- 시작 상태에서의 진입은 객체를 새로 생성하는 이벤트만 명시하거나 아예 어떤 것도 명시하지 않아야 함
- 상태 진입: 객체의 한 상태에서 다른 상태로 이동하는 것
- 특정 이벤트가 발생한 후 명세된 조건을 만족한 경우에 이루어진다.
private static int ON = 0;
private static int OFF = 1;
private int state;
public class Light{
private static int ON = 0; // 형광등이 켜진 상태
private static int OFF = 1; // 형광등이 꺼진 상태
pricate int state; // 형광등의 현재 상태
public Light(){
state = OFF; // 형광등 초기 상태는 꺼져 있는 상태임
}
public void on_button_pushed(){
if( state == ON ){
System.out.println("반응 없음");
}
else { // 형광등이 꺼져 있을 때 On 버튼을 누르면 켜진 상태로 전환
System.out.println("Light On!");
state = ON;
}
}
public void off_button_pushed(){
if( state == OFF) {
System.out.println("반응 없음");
}
else { // 형광등이 켜져 있을 때 OFF 버튼을 누르면 꺼진 상태로 전환됨
System.out.println("Light Off!");
state = OFF;
}
}
}
public class Client{
public static void main(String[] args){
Light light = new Light();
light.off(); // 반응 없음
light.on();
light.off();
}
}
private static int SLEEPING = 2;
public void on_button_pushed(){
if(state == ON) { // 형광등이 켜져 있는 경우에 On 버튼을 누르면 취침등 상태로 전환됨
System.out.println("취침등 상태");
state = SLEEPING;
}
else if(state == SLEEPING) { // 형광등이 취침등 상태에 있는 경우
System.out.println("Light On!"); // On 버튼을 누르면 켜진 상태로 전환됨
state = ON;
}
else { // 상태가 꺼져 있는 경우에 On 버튼을 누르면 켜진 상태로 전환됨
System.out.println("Light On!");
state = ON;
}
}
public class Light{
private static int ON = 0;
private static int OFF = 1;
private static int SLEEPING = 2;
private int state;
public Light(){
state = OFF; // 초기 상태는 형광등이 꺼져 있는 상태
}
public void off_button_pushed(){
if(state == OFF) { // 형광등이 꺼져 있는 경우에 OFF 버튼을 누르면 상태 전환 없음
System.out.println("반응 없음");
}
else if(state == SLEEPING) { // 형광등이 취침등 상태에 있는 경우
System.out.println("Light OFF!"); // Off 버튼을 누르면 OFF로 전환됨
state = OFF;
}
else {
System.out.println("Light Off!");
state = OFF;
}
}
}
public void on_button_pushed(){
if(state == ON){ // 형광등이 켜져 있는 경우에 On 버튼을 누르면 취침등 상태로 전환됨
System.out.println("취침등 상태");
state = SLEEPING;
}
else if(state == SLEEPING){ // 형광등이 취침등 상태에 있는 경우
System.out.println("Light On!");
state = ON;
}
else { // 꺼져 있는 상태라면 On 버튼을 눌렀을 때 켜진 상태로 전환됨
System.out.println("Light On!");
state = ON;
}
}
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);
}
}
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!");
}
}
public class OFF implements State{
private static OFF off = new OFF(); // OFF 클래스의 인스턴스로 초기화됨
private OFF() { }
public static OFF getInstance() { // 초기화된 OFF 클래스의 인스턴스를 반환함
return off;
}
public void on_button_pushed(Light light){ // Off 상태일 때 On 버튼을 눌러도 On 상태임
light.setState(ON.getInstance());
System.out.println("Light On!");
}
public void off_button_pushed(Light light){ // Off 상태일 때 Off 버튼을 눌러도 변화 없음
System.out.println("반응 없음");
}
}
Reference
글 정말 잘쓰셨네요. 정말 잘보았습니다. 감사합니다.