

Intent
Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.
캡슐화를 깨지 않고 객체의 이전상태를 저장할 수 있게 하기 위해서 객체의 내부 상태를 잡아 내거나 구체화 한다.
살아가다 보면 기억을 더듬어 좋은 시절로 돌아가고 싶을 때가 있지 않나? 패턴 중에는 그런 기능을 하는 것이 있다. 객체의 이전상태를 저장해두고 돌아가고 싶을 때 이전상태로 백업할 수 있는 패턴이 있는데 바로 Memento패턴이다.
Memento패턴의 각 요소 별 기능은 이렇다.
Memento클래스는 Originator 객체의 상태를 저장하고 다른 객체들의 접근에 대해서 보호한다. Originator 클래스는 현재 내부 상태를 담은 memento 객체를 생성하고 memento를 이용하여 내부상태를 복구한다. Caretaker 클래스는 memento의 상태보관을 보호하지만 memento객체의 내용을 건딜 수가 없다. 그 이유는 caretaker는 memento에 대한 좁은(narrow) interface를 제공 받지만 originator는 memento보다 더 강력한 접근 권한을 가지고 있다. 이것은 아무 객체나 memento객체에 가능하면 외부 프로그램에 의해 피해를 당할 수 있기 때문에 memento를 생성할 때 더욱 높은 권한을 캡슐화를 한다.
Memento는 캡슐화가 가능한 언어에서 캡슐화를 유지하면서 어떤 객체의 상태를 저장하는 방법을 제공한다. 그러므로 유일한 Originator클래스에서의 데이터는 private를 유지하는 교화적인 접근을 한다. 그것은 또 Memento 클래스에 정보를 저장 또는 재저장을 위임함으로써 Originator 클래스의 단순성을 보호한다. 반면, Memento가 저장해야 하는 정보의 양이 클 수도 있기 때문에 저장하는데 시간이 오래 걸릴 수 있다. 이것은 상태를 저장하기 위한 객체들의 수를 제한하는 전략을 설계할 수 있는 Caretaker 클래스(mediator)에서 보다 효율적이다. 예측이 가능한 상태로 객체들이 바뀌는 경우에는 각각의 Memento가 객체의 상태를 단지 추가적인 변경만으로 저장하기 때문에 유리할 수 있다.