[디자인 패턴][행동 패턴] 메멘토 패턴(Memento Pattern)
Updated:
1. 개요
객체의 내부 상태를 저장하고, 이후 해당 상태로 되돌아올 수 있도록 하는 패턴
메멘토 패턴(Memento Pattern)은 행동 패턴(Behavioral Pattern)의 한 종류로, 내부 상태의 스냅샷을 저장하여 해당 시점의 상태로 되돌아올 수 있도록 하는 패턴이다.
2. 행동 패턴(Behavioral Pattern)
2-1. 행동 패턴이란?
행동 패턴이란 처리의 책임을 어떤 객체에게 할당하는 것이 좋은지, 알고리즘을 어떤 객체에 정의하는 것이 좋은지 등의 책임 분배와 관련된 패턴이다.
2-2. 행동 패턴 종류
3. 구성
[출처 : GoF의 디자인 패턴]
-
Memento : Originator 객체의 내부 상태를 저장하는 클래스로, Originator 객체만 접근 가능
-
Originator : Memento 생성하여 현재 객체의 상태를 저장하고, 내부 상태를 복원
-
Caretaker : Memento의 보관을 책임지는 보관자
4. 예제 코드
Memento Pattern을 이용하여 현재의 상태를 저장하고, 해당 상태로 되돌아오는 과정을 코드로 구현해보자.
4-1. Memento
[Memento.java]
1
2
3
4
5
6
7
8
9
10
11
12
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
4-2. Originator
[Originator.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
4-3. Caretaker
[Caretaker.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.ArrayList;
import java.util.List;
public class Caretaker {
private List<Memento> mementoList = new ArrayList<>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
5. 테스트
[Clinet.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState("State #1");
originator.setState("State #2");
caretaker.add(originator.saveStateToMemento());
originator.setState("State #3");
caretaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(caretaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(caretaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}
[실행 결과]
6. 특징
-
캡슐화 : Originator만 Memento 객체를 이용할 수 있으므로 Memento가 외부에 노출되지 않음
-
비용의 증가 : 많은 양의 정보를 저장하거나 자주 반환해야 하는 경우 상당한 오버헤드 발생 가능
Leave a comment