@Getter publicclassGumballMachine { private State soldOutState; private State noQuarterState; private State hasQuarterState; private State soldState; privateStatestate= soldOutState; privateintcount=0;
@Override publicvoiddispense() { System.out.println("알맹이가 나갈 수 없습니다."); } }
생각해보자
상태 패턴은 사용자로 하여금 동일한 요청에 대해 시스템이 갖고 있는 상태에 따라 다른 반환 값을 보여준다는 점에서 굉장히 유연한 설계가 될 수 있다고 생각했다.
‘상태라는 것이 태생적으로 공유자원에 속하기 때문에, 상태를 객체로 관리하면 동시성 문제가 발생 할 여지가 있겠다..’ 라는 생각이 들었다. 동시성 문제를 해결 혹은 방지하기 위해 여러가지 해결법이 이미 많이 나와있지만, 가장 편한 것은 역시 DB에서 상태 값으로 관리하는 것이라는 생각이 들었다. 그래서 상태 패턴을 적용한 코드를 찾아보기 힘들었던 것이 아닐까..?
또한, 상당히 오래된 코드이다보니 상태값을 setState(newState); 라는 메소드로 변경하는 것에 대해 굉장히 불편한 생각이 들었다. change**State() 라는 별도의 메소드로 관리하면 어떨까?
그간 책에 나와있는 코드들을 마치 진리로 자연스럽게 받아들이곤 했는데, ‘불편하다’라는 생각이 들었다는 것은 한편으로 보면 자만일 수도 있고, 내가 조금은 성장하진 않았을까 생각이 번갈아가면서 들었다. 앞으론 책에 나와있는 코드도 조금은 비판적으로(비난) 보는 습관을 들여야겠다.