[행위패턴] Memento 패턴

Updated: Categories:

Memento 패턴에 대해 알아보자

그게 뭐야 ❓

  • 객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원할 수 있는 패턴
  • 한마디로 객체지향의 ctrl + Z 기능이다 😬


클래스 다이어그램

  • Originator는 원본, Memento는 복사본, CareTaker는 상태 추적 클래스이다.
  • 실제로 어떻게 구현하는지 살펴보자


문제상황

  • 한 클래스에 데이터를 저장하고, 이 클래스의 모든 변경사항을 추적하는 시스템을 구현해야함
  • 사용자가 원하는 시점에서 복원을 선택하면 클래스의 이전 상태를 출력해줘야 함


시스템 구조


  • Main : 원본 클래스를 생성하고 CareTaker를 사용해 복사본의 상태를 관리한다.
  • Orginator : 데이터를 담는 원본 클래스이며, 복사본(Memento)을 만들거나 저장하는 메소드를 가진다.
  • Memento : 원본과 같은 구조를 가지는 복사본 클래스.
  • CareTaker : 스택 구조를 활용해 복사본을 쌓는다. (선입선출이므로 복원 시 바로 전 복사본을 pop하게 됨)


추가 정보

  • redo/undo를 지원하는 커맨드 패턴과 자주 쓰인다고 한다

장점

  • 복사본을 쌓는 스택은 CareTaker 클래스에서 수행하고, 복사본 생성/복원의 동작은 Orginator가 수행하므로 캡슐화가 지켜진다!

단점

  • 상태추적 대상 객체의 크기가 매우 크다면 복사본 크기 또한 크다. -> 메모리 낭비로 이어질 수 있음
    • 객체 생성/삭제가 잦거나 객체 내부가 매우 복잡하다면 사용하지 말자
  • 클라이언트 단에서 메멘토 객체에 접근이 아예 불가능해서 어떤 상황인지 아예 모른다.


참고링크

  • https://lktprogrammer.tistory.com/65
  • https://sticky32.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EB%A9%94%EB%A9%98%ED%86%A0-%ED%8C%A8%ED%84%B4Memento-Pattern#context