요약
- 상태 패턴
- 새로운 디자인 구상하기
- State 인터페이스 및 클래스 정의하기
- State 클래스 구현하기
- 뽑기 기계 전체 코드 살펴보기
- 다른 상태 클래스 구현하기
- 뽑기 기계 구조 다시 살펴보기
메모
새로운 디자인 구상하기
- 기존 코드를 그대로 활용하는 대신, 상태 객체들을 별도의 코드에 넣고, 어떤 행동이 일어나면 현재 상태 객체에서 필요한 작업을 처리하게 함.
- 우선 뽑기 기계와 관련된 모든 행동에 관한 메소드가 들어있는 State 인터페이스를 정의한다.
- 기계의 모든 상태를 대상으로 상태 클래스를 구현한다.
- 조건문 코드를 전부 없애고 상태 클래스에 모든 작업을 위임한다.
State 인터페이스 및 클래스 정의하기
- State 인터페이스에는 뽑기 기계에서 일어날 수 있는 모든 행동에 직접적으로 대응함.
- insertQuater(), ejectQuater(), turnCrank(), dispense()
- 각 상태는 다음과 같이 나온다.
- SoldState, SoldOutState, NoQuaterState, HasQuaterState, WinnerState
State 클래스 구현하기
public class NoQuaterSatate implements State {
GumballMachine gumballMachine;
public NoQuaterState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
public void insertQuater() {
System.out.println("동전을 넣으셨습니다.");
gumballMachine.setState(gumballMachine.getHasQuaterState());
}
public void ejectQuater() {
System.out.println("동전을 넣어 주세요.");
}
public void trunCrank() {
System.out.println("동전을 넣어 주세요.");
}
public void dispense() {
System.out.println("동전을 넣어 주세요.");
}
}
- 상태에 맞게 적절한 행동을 구현해야 함.
- 상황에 따라, 뽑기 기계의 상태가 다른 상태로 전환될 수 있음.
뽑기 기계 전체 코드 살펴보기
다른 상태 클래스 구현하기
- 구현 p434 ~ 435 참고
- HasQuaterState 의 경우, 동전을 넣는 건 부적절한 메서드이므로, 예외 메시지를 던져준다.
- 동전을 반환한다면, 동전을 반환하고 NoQUaterState로 전환함.
- 사용자가 손잡이를 돌리면, soldState 로 변환함.
- SoldState의 경우, 동전 투입, 반환, 손잡이 돌리기는 부적절함.
- 알맹이 판매 상태에서, 손잡이를 돌렸을 때, 알맹이 갯수여부에 따라, 동전 없음 상태로 가거나, 판매 완료 상태로 가게 된다.
뽑기 기계 구조 다시 살펴보기
- 뽑기 기계 구조를 상태 패턴을 이용하여 구조적으로 바꿈으로써 다음과 같은 결과를 얻음
- 각 상태의 행동을 별개의 클래스로 국지화함.
- 관리하기 힘든 if 선언문을 없앰
- 각 상태를 변경에 닫혀 있게 하고, GumballMachine 클래스는 새로운 상태를 추가하고 확장에 열려있도록 고침 (OCP)
- 더 이해하기 좋은 코드베이스와 클래스 구조를 만듦.