책너두 (헤드 퍼스트 디자인 패턴) 32일차 (~439p)

요약

  • 상태 패턴
    • 새로운 디자인 구상하기
    • State 인터페이스 및 클래스 정의하기
    • State 클래스 구현하기
    • 뽑기 기계 전체 코드 살펴보기
    • 다른 상태 클래스 구현하기
    • 뽑기 기계 구조 다시 살펴보기

메모

새로운 디자인 구상하기

  • 기존 코드를 그대로 활용하는 대신, 상태 객체들을 별도의 코드에 넣고, 어떤 행동이 일어나면 현재 상태 객체에서 필요한 작업을 처리하게 함.
  1. 우선 뽑기 기계와 관련된 모든 행동에 관한 메소드가 들어있는 State 인터페이스를 정의한다.
  2. 기계의 모든 상태를 대상으로 상태 클래스를 구현한다.
  3. 조건문 코드를 전부 없애고 상태 클래스에 모든 작업을 위임한다.

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("동전을 넣어 주세요.");
    }
}
  • 상태에 맞게 적절한 행동을 구현해야 함.
  • 상황에 따라, 뽑기 기계의 상태가 다른 상태로 전환될 수 있음.

뽑기 기계 전체 코드 살펴보기

  • p433 참고

다른 상태 클래스 구현하기

  • 구현 p434 ~ 435 참고
  • HasQuaterState 의 경우, 동전을 넣는 건 부적절한 메서드이므로, 예외 메시지를 던져준다.
    • 동전을 반환한다면, 동전을 반환하고 NoQUaterState로 전환함.
    • 사용자가 손잡이를 돌리면, soldState 로 변환함.
  • SoldState의 경우, 동전 투입, 반환, 손잡이 돌리기는 부적절함.
    • 알맹이 판매 상태에서, 손잡이를 돌렸을 때, 알맹이 갯수여부에 따라, 동전 없음 상태로 가거나, 판매 완료 상태로 가게 된다.

뽑기 기계 구조 다시 살펴보기

  • 뽑기 기계 구조를 상태 패턴을 이용하여 구조적으로 바꿈으로써 다음과 같은 결과를 얻음
    • 각 상태의 행동을 별개의 클래스로 국지화함.
    • 관리하기 힘든 if 선언문을 없앰
    • 각 상태를 변경에 닫혀 있게 하고, GumballMachine 클래스는 새로운 상태를 추가하고 확장에 열려있도록 고침 (OCP)
    • 더 이해하기 좋은 코드베이스와 클래스 구조를 만듦.

댓글

Designed by JB FACTORY