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가 외부에 노출되지 않음

  • 비용의 증가 : 많은 양의 정보를 저장하거나 자주 반환해야 하는 경우 상당한 오버헤드 발생 가능

Updated:

Leave a comment