[행위패턴] Memento 패턴
Updated: Categories: DesignPatternMemento 패턴에 대해 알아보자
그게 뭐야 ❓
- 객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원할 수 있는 패턴
- 한마디로 객체지향의 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