게임의 롤백이나 Ctrl+Z 처럼 작업을 진행하다보면 특정 의도에 의해 이전 상태를 복구해야하는 경우가 생긴다.
이를 구현하기 위해서는 객체의 현재상태를 기록하는 스냅샷을 따로 관리해야한다.
스냅샷 생성을 위해서는 필드들의 현재상태를 파악해야 하는데, private
필드처럼 비공개인 경우에는 외부에서 파악하는데 어려움이 있다.
또한, 객체의 필드를 추가 혹은 삭제하려는 경우에는 객체들의 상태를 복사하는 클래스도 함께 변경해야한다.
즉, 클래스 내부정보를 외부에서 접근하고 조작하도록 구성하면 여러가지 문제가 발생한다.
이를 해결하기 위해서는 현재 객체의 스냅샷 생성과 관리를 동일한 클래스 내부에서 해결해야한다.
즉, 클래스의 복사본을 생성하고 관리하는 책임을 외부에 맡겨서는 안된다.
이때, 클래스 내부에서 객체 상태의 복사본을 저장하는 객체를 Memento
라고 부른다.
메멘토의 상태는 메멘토를 생성한 객체에서만 접근할 수 있으며, 외부에서는 제한된 인터페이스를 통해 접근해야한다.
여기서 제한된 인터페이스를 통해 접근하는 외부 클래스를 Caretaker
라고 부른다.
원본 객체 클래스내에 메멘토 클래스가 존재하는 구성방식이다.
Caretaker
라고 불리는 외부 클래스에서 Originator
객체와 메멘토 객체들을 보유하고 있으며,
제한된 인터페이스를 통해 정보를 얻어올 수 있다.
즉, Caretaker
에서 메멘토 객체의 값을 변조할 수 없다.
인터페이스를 사용하여 Caretaker
에서는 인터페이스 타입의 메멘토 객체들을 보유하는 구성방식이다.
Caretaker
는 인터페이스 타입의 메멘토 객체만을 가지고있으므로 인터페이스에 정의된 제한된 메서드로만 정보를 얻을 수 있다.
반면, Originator
는 인터페이스의 구현체와 직접 작업하도록 구성한다.
Caretaker
에서 Originator
객체를 가지지 않고, 메멘토 구현체에서 복원작업을 수행하는 구성방식이다.
각 메멘토 구현체가 자신의 Originator
와 연결되어 있으며, Originator
의 값이 외부에 노출되지 않는다는 특징이 있다.