Memento Pattern

개념
- 상태를 보존한다. 어떤 시점에서의 인스턴스의 상태를 기록해서 저장 해두었다가 나중에 인스턴스를 그 시점의 상태로 되돌리는 패턴

I. 의도

     캡슐화를 위배하지 않으면서 객체의 내부 상태를 파악하고 표현함으로써 객체의 상태를 저장해 준 상태로 다시 복구할 수 있게 한다

        정의: 상태를 보존한다. 어떤 시점에서의 인스턴스의 상태를 기록해서 저장 해두었다가 나중에 인스턴스를 그 시점의 상태로 되돌리는 패턴
              : 객체를 이전의 상태로 복구시켜야 하는 경우에는 메멘토 패턴을 쓰면 된다.

II. 활용

  • 각 시점에서의 객체 상태를 저장한 후 나중에 이 상태로 복구해야 할 때 - undo
  • 상태를 얻는데 필요한 직접 인터페이스는 객체의 자세한 구현 내용을 드러나게 하고 객체의 캡슐화를 위배하는 것이므로 이를 해결할 때

III. 결과

  • 캡슐화된 경계를 유지할 수 있다
  • originator 클래스를 단순화할 수 있다 – originator가 다양한 버전의 내부 상태를 모두 저장하고 있어야 하나 클라이언트가 자신이 필요한 상태를 별도로 관리하게 되면 originator가 간단해지고, 상태를 변경할 때 마다 클라이언트는 originator에게 이를 알려줄 필요도 없다
  • originator가 많은 양의 정보를 저장하거나 자주 memento를 교환해야 할 경우 상당한 오버헤드 가능
  • 좁은 범위의 인터페이스와 넓은 범위의 인터페이스를 정의해야 한다
  • memento를 다루기 위해 감추어진 비용이 존재한다

관련 패턴: command 패턴에서 취소가 가능한 오퍼레이션의 상태를 저장할 때 memento를 사용한다

    memento 패턴을 사용해서 iterator 패턴의 반복 과정 상태를 관리할 수 있다

 

Memento: Originator 객체의 내부 상태를 저장한다. 메멘토는 originator 객체의 내부 상태를 필요한 만큼 저장해 둔다. originator 객체를 제외한 다른 객체는 Memento 클래스에 접근할 수 없다. 그래서 Memento 클래스는 두 개의 인터페이스를 갖는다. 관리 책임을 갖는 객체인 CareTaker 클래스는 Memento 에 정의된 모든 인터페이스를 다 보지 못하고 단지 Memnto 를 다른 객체에 전달한다. 이에 비해 Originator 클래스는 자신의 상태를 이전 상태로 복구하기 위해 필요한 모든 자료에 접근하는데 필요한 Memento 의 다양한 인터페이스를 사용할 수 있다. 즉, 메멘도를 생성하는 Originator 클래스만이 메멘토의 내부상태에 접근할 수 있는 권한을 갖는다.

Originator: 메멘토를 생성하여 현재 객체의 상태를 저장하고 내부 상태를 복구한다.

Caretaker: 메멘토의 보관을 책임지기는 하지만, 메멘토의 내용을 확인하거나 처리하지는 않는다.

 

 

댓글