상태 패턴
- 행위 패턴
- 일련의 규칙에 따라 객체 내부의 상태를 변화시켜, 객체가 할 수 있는 행위를 바꾸는 패턴
- 특정 기능을 수행한 후 다음 상태를 반환한다.
State Interface
State implements interface
- Context 객체가 요청한 작업을 override하여 실행한다.
- 다음 상태를 결정해 상태 변경을 Context 객체에 요청하는 역할을 수행한다
Context:
- 사용자가 관심 있는 인터페이스를 정의한다.
- 객체의 각 상태를 정의한 State의 구현체 인스턴스를 관리한다.
상태 패턴 예시
- 돈을 받아 음료수를 뽑을 수 있는 음료 자판기를 만든다고 가정한다
- 자판기는 두 개의 상태를 갖는다.
- 돈을 받았다.
- 돈을 더 받아도 상태는 변하지 않는다.
- 음료를 뽑을 수 있다.
- 음료를 뽑으면 돈을 받지 않는 상태로 변한다.
- 돈을 받지 않았다.
- 돈을 받으면 상태가 변한다.
- 음료를 뽑으려 해도 상태는 변하지 않는다.
- 돈을 받기를 기다린다.
상태 패턴 장단점
장점
- 상태가 많아지더라도 코드의 복잡도가 증가하지 않는다.
- 클래스를 추가하여도 기존의 메서드 코드가 유지된다.
- 상태별 동작을 수정하기 쉽다.
단점
- 상태 구현 클래스가 많아지면 변경 규칙을 파악하기 어렵다.
- 한 상태 클래스에서 다른 상태 클래스에 대한 의존도가 발생할 수 있다.
상태 패턴 vs 전략 패턴
공통점
- 구조는 동일
- 인터페이스를 사용하여 구현 클래스를 캡슐화한다.
- 구현 클래스의 영향을 받지 않고 유연한 변경에 대처가 가능하다.
차이점
- 전략 패턴은 한 번 인스턴스를 생성하고, 상태가 거의 바뀌지 않을 때 사용한다.
- 상태 패턴은 한 번 인스턴스를 생성하고, 상태가 빈번하게 바뀌는 경우에 사용한다.
- 상태 패턴은 State스스로를 변환할 수 있지만, 전략패턴은 외부에서 입력이 필요하다.
- 즉, 상태 패턴에서는 객체 내부 상태에 따라 현재 상태를 나타내는 객체가 바뀌고, 그 결과 context 객체의 행동도 바뀐다.