본문 바로가기

프로그래밍 강의 메모/코딩으로 학습하는 GoF의 디자인 패턴_백기선

행동 관련 디자인 패턴 > 메멘토 패턴(Memento Pattern)

https://inf.run/6Shr

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

 

메멘토 패턴

  • 행동 관련 디자인 패턴.
  • 캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법.
  • 객체 상태를 외부에 저장했다가 해당 상태로 다시 복구할 수 있다.

 

객체 직렬화에서 메멘토 패턴을 활용한다.

 

 

어떤 객체의 상태를 밖에 저장하려고 한다면 객체 상태가 외부에 노출이 되어야 한다.

그러나 이처럼 객체의 상태를 외부에 노출시키지 않으면서, 즉 캡슐화시켜 외부에 저장했다가 복원하는 방법이 메멘토 패턴이다.

 

 

게임 정보를 저장했다가 복원할 때 클라이언트가 게임의 내부 정보가 뭐가 있는지 일일이 알고있어야 불러올 수 있다면 캡슐화가 깨져 있는 상태이다.

 

이런 상태로 구현한다면 기존 정보가 사라지거나 새로운 정보가 필요하게 되는 경우 등 게임의 내부 정보가 변경되었을 시 클라이언트도 게임의 내부정보에 디테일하게 의존하고 있기 때문에 클라이언트도 수정이 이루어져야한다.

 

 

 

 

 

 

 

클래스 다이어그램을 살펴보면 Originator가 가장 중요한데,

Originator는 저장하려는 원래 데이터를 갖고있는 클래스라고 볼 수 있다.

Originator의 내부 정보를 CareTaker가 가져와서 저장하고 있고,

내부 정보를 Memento라는 클래스로 추상화한다.

그래서 CareTakerOriginator의 디테일한 상태 정보를 갖고있는 것이 아니라,

Memento라는 타입으로 갖고 있다.

그래서 Originator는 2개의 메시지가 필요한데,

Memento라는 타입으로 내부 정보를 저장해주는 CreateMementor(),

Memento라는 타입에서 다시 자신의 정보를 복원하는 restore(Memento)가 이에 해당한다.

 

Memento는 내부 상태 정보가 한번 세팅이 되면 변경할 수 없는 형태로 객체를 구성한다.

 

Originator에서 내부 상태 정보를 Memento로 감싸서 CareTaker로 주고,

CareTaker는 이 정보를 가지고 있다가, 

본인이 필요로하는 시점에, 

Memento에서 Originator필요한 정보로 복원한다.




Implementation based on nested classes



Implementation based on an intermediate interface



Implementation with even stricter encapsulation



 

메멘토 패턴의 장점

1. 캡슐화를 지키면서 상태 객체, 상태 스냅샷을 만들 수 있다.

2. 객체 상태를 저장하고 또는 복원하는 역할케어테이커에게 위임할 수 있다.

3. 객체 상태가 바뀌어도 클라이언트 코드를 변경하지 않는다.

 

메멘토 패턴의 단점

많은 정보를 저장하는 메멘토를 자주 생성하는 경우 메모리 사용량에 많은 영향을 줄 수 있다.

 

 

 

 

 

 

 

https://refactoring.guru/ko/design-patterns/memento

 

Memento

/ Design Patterns / Behavioral Patterns Memento Also known as: Snapshot Intent Memento is a behavioral design pattern that lets you save and restore the previous state of an object without revealing the details of its implementation. Problem Imagine that

refactoring.guru