> For the complete documentation index, see [llms.txt](https://blakes-organization.gitbook.io/rainsister/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://blakes-organization.gitbook.io/rainsister/design-pattern/state-pattern.md).

# State Pattern

정의

동일한 동작을 객체의 상태에 따라 각각 다르게 처리해야 할 때 사용한다. 캡슐화한 객체 상태를 참조하는 방식으로 처리한다.

## 적용 케이스

네이트 상태를 예를 들면. 온라인,자리비움 다른 용무 중 등 상태는 변경하기 위해서는 모두 각자의 액션이 있고 상대방도 내 상태(온라인, 자리비움, 다른 용무중) 등 상태를 볼수 있다.

<figure><img src="https://3202568828-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FgVNjdXkr3ciD8p5jXPCI%2Fuploads%2Ff1pFytMF4kY5MIgdrDQV%2Fimage.png?alt=media&amp;token=a2f10d75-81c9-4157-828b-3440ae51a76f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3202568828-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FgVNjdXkr3ciD8p5jXPCI%2Fuploads%2FMGiM5CKMdIqgz3Ud4PSe%2Fimage.png?alt=media&amp;token=84466a34-4118-4400-8b23-b14d5e020cc0" alt=""><figcaption></figcaption></figure>

```java
public class State {
	
	private String value;
	
	public String getValue() {
		return value;
	}
 
	public void setValue(String value) {
		this.value = value;
	}
 
	public void method1(){
		System.out.println("execute the first opt!");
	}
	
	public void method2(){
		System.out.println("execute the second opt!");
	}
}
```

```java
public class Context {
 
	private State state;
 
	public Context(State state) {
		this.state = state;
	}
 
	public State getState() {
		return state;
	}
 
	public void setState(State state) {
		this.state = state;
	}
 
	public void method() {
		if (state.getValue().equals("state1")) {
			state.method1();
		} else if (state.getValue().equals("state2")) {
			state.method2();
		}
	}
}
```

```java
public class Test {
 
	public static void main(String[] args) {
		
		State state = new State();
		Context context = new Context(state);
		
		// 첫번째 상태로 설정
		state.setValue("온라인");
		context.method();
		
		// 두번째 상태로 설정
		state.setValue("자리비움");
		context.method();
		
		// 세번째 상태로 설정
		state.setValue("다른 용무 중");
		context.method();
	}
}
```
