[디자인 패턴] 메멘토 패턴
메멘토(memento)는 기억한다는 뜻의 라틴어다.
그리고 놀란의 대표작으로도 유명하다.
명작이니 안봤다면 꼭 보길 바란다.
메멘토 패턴은 단어의 뜻처럼, 객체의 상태를 기억해놨다가 다시 복구하게 해주는 패턴이다.
이걸 어떨 때 쓸까?
생각해보면 사용처는 꽤 많다. 대부분의 상용 프로그램에는 '실행취소'라는 기능이 존재한다.
이런걸 구현하려면 당연히 이전의 상태를 저장해놓을 필요가 있다.
근데 그냥 대충 배열같은걸로 저장만 한다면 OOP 언어를 왜 쓰겠는가?
메멘토 패턴을 활용한다면 캡슐화 등을 위반하지 않으면서 기능을 분리해서 상태 저장을 구현할 수 있다.
일단 메멘토 패턴을 쓰기 전에 대충 틀을 만들어보자.
게임 플레이어를 표현하는 객체를 만들어보겠다.
레벨과 체력, 힘... 등의 능력치와 돈이 멤버로 저장되어있다.

여기에 메멘토 패턴을 적용해보겠다.
메멘토 클래스와 전반적인 상태와 메멘토의 관리자(Originator)가 필요하다.
메멘토는 그냥 담백하게 상태만 저장하고 반환해준다. 별다른 기능은 하지 않는다.

그리고 수월한 상태의 복사를 위해 clone 메서드를 구현해놨다.

그리고 Originator다.
이 클래스는 현재 GamePlayer의 상태를 잘 사용하되,
필요한 상황에서는 현재 상태를 저장해두거나 저장된 상태로 롤백할 수 있다.

난 메멘토는 Originator의 내부 클래스로 집어넣어놨다.
꼭 그래야한다는 건 아니고..
메멘토 객체들을 어떻게 관리할지는 표현하지 않았다만...
뭐 따로 배열이나 큐 등으로 관리하는게 바람직할 것이다.

참조
GoF의 디자인 패턴
헤드퍼스트 디자인 패턴
https://ko.wikipedia.org/wiki/%EB%A9%94%EB%A9%98%ED%86%A0_%ED%8C%A8%ED%84%B4