google maps +S2개발을 완료하고, 시간이 조금 남아서 실행취소, 재실행,그리기, 지우기 기능을 리팩토링을 진행하였습니다. 해당 기능을 구현하기 위해 디자인 패턴을 찾아보니 메멘토 패턴을 대부분 쓰는거 같아서 이번 기회에 공부해보고 적용해본 후기를 남기려고 합니다.
메멘토 패턴
메멘토 패턴은 캡슐화가 잘 된 객체에 접근할 수 있도록 3가지 객체로 이루어집니다.

오리지네이터 (Originator)
오리지네이터는 내부의 상태를 가지고 있는 객체입니다.
- 객체에 내부 상태를 저장
- 객체로부터 이전 상태를 복구
오리지네이터는 단독으로 객체에 접근할 수 있습니다.
케어테이커 (Caretaker)
케어테이커는 오리지네이터에 대해서 액션을 제공하지만, 변경에 대한 취소 및 저장에 대해서만 제공합니다. 다른 기능도 제공하게 되면 단일-책임원칙에 위배되기 때문입니다.
메멘토 (Memento)
메멘토 객체는 Originator와 반대로, 변경되기 이 전의 상태를 갖고있는 객체입니다.
위의 3가지 객체는 아래의 순서대로 작동합니다.
- 케어테이커는 오리지네이터에 대해서 변경에 대한 실행 취소를 진행합니다.
- 그러기 위해 오리지네이터에게 메멘토 객체를 요청합니다.
- 오리지네이터는 내부 상태를 변경하기위해서 메멘토 객체를 반환하며 케어테이커는 반환된 메멘토 객체를 적용합니다.
케어테이커(클라이언트)는 오리지네이터로 부터 메멘토를 요청합니다. 이는 오리지네이터의 내부 상태를 저장하기 위함이며, 오리지네이터에게 메멘토를 다시 돌려줄 수 있습니다.
기능구현
redoStack(재실행), undoStack(실행취소), undoStackCurrent(현재 지도에 보여지는 상태) 총 3가지의 state를 가지며
undo(), redo(), delete() 총 3개의 케어테이커(Caretaker)를 만들었습니다. 또한 실행취소/재실행에 대한 활성 비활성화를 위해 canUndo(), canRedo()를 통해 재실행, 실행취소를 할수있는지 redoStack, undoStack의 data.length를 통해 판단할수있게 설계.
지도설정 활성/비활성
활성: 실행취소, 재실행, 지도이동, 그리기, 지우기, marker 중앙이동 등 모든 기능을 사용가능
비활성: 지도이동, marker 중앙이동 의 기능만 사용가능


그리기
지도에 s2Cell 그릴시 지우개 버튼 활성화, 없다면 비활성화
지도에 그리기를 하였을경우 undoStack에 차례대로 스택을 쌓아줍니다.


실행취소/재실행
실행취소시 재실행을 할수있게 redoStack에 차례대로 data를 undoStack에서 pop()해서 redoStack.push(data) 해줍니다. 재실행은 반대로 동작합니다.

