본문 바로가기

PROGRAMMING/Design Pattern

[GoF] 메멘토 (Memento) 패턴

메멘토 (Memento) 패턴 행동 패턴

객체의 상태를 저장할 수 있는 객체를 통해 객체의 상태를 되돌릴 수 있게 합니다.


컴퓨터 소프트웨어의 대부분은 사용자의 기호에 알맞게 소프트웨어를 사용할 수 있도록 환경 설정이라는 기능을 지원한다. 사용자는 환경 설정이 제공하는 인터페이스를 통해 소프트웨어의 환경을 설정하고 이를 소프트웨어에 적용할 수 있다. 이 때, 사용자가 설정한 환경이 마음에 들지 않을 경우, 취소를 통해 환경을 설정 이전으로 되돌릴 수가 있다. 환경 설정은 설정하기 이전의 환경을 어떻게 되돌릴 수 있었을까?

메멘토 패턴은 객체의 상태를 저장할 수 있는 메멘토 객체를 정의하여, 객체의 상태를 메멘토 객체에 저장한 후 클라이언트의 요구에 따라 메멘토 객체를 통해 객체의 상태를 복원할 수 있다.

메멘토 패턴에서는 책임에 따라 객체를 3가지로 나눌 수 있다:

- 오리지네이터 (Originator) : 상태를 저장하고 복원할 객체의 주체이다.

- 케어테이커 (Caretaker) : 오리지네이터의 저장과 복원을 제어한다.

- 메멘토 (Memento) : 오리지네이터의 상태를 저장한다.

케이테이커가 오리지네이터에게 상태를 저장할 수 있도록 메멘토 객체를 요청하면, 오리지네이터가 메멘토 객체를 생성하여 케어테이커에 저장된다. 그 후 일련의 명령을 통해 객체의 상태가 변경된 후에 케어테이커가 오리지네이터에게 상태를 복원하고자 할 경우, 케이테이커가 오리지네이터에게 메멘토 객체를 넘겨주어 오리지네이터는 메멘토 객체를 통해 상태를 복원한다.

메멘토 패턴을 이용하여 객체를 복원할 경우, 클라이언트는 객체로의 직접적인 접근 없이 메멘토 객체를 통해 캡슐화 된 객체의 복원을 수행할 수 있다. 또한 케어테이커 객체를 통해 객체의 상태를 여러개 저장할 수도 있고, 클라이언트의 기호에 맞게 객체를 복원할 수 있다. 그러나 객체가 복잡한 상태를 저장하고자 할 경우 메멘토 객체에 대한 비용이 부담 될 수가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class PatternMemento
{
    public class Originator
    {
        private string _state;
 
        public void SetState(string state)
        {
            _state = state;
        }
 
        public Memento CreateMemento()
        {
            return new Memento(_state);
        }
 
        public void Restore(Memento memento)
        {
            _state = memento.state;
        }
 
        public void Operate()
        {
            Console.WriteLine("Operating Originator as " + _state + " State");
        }
    }
 
    public class Memento
    {
        private string _state;
 
        public string state
        {
            get
            { return _state; }
        }
 
        public Memento(string state)
        {
            _state = state;
        }
    }
 
    public static void Main(string[] args)
    {
        Originator originator = new Originator();
 
        originator.SetState("A");
        originator.Operate();
 
        Memento memento = originator.CreateMemento();
 
        originator.SetState("B");
        originator.Operate();
 
        originator.Restore(memento);
        originator.Operate();
    }
}
cs

1
2
3
4
Operating Originator as A State
Operating Originator as B State
Operating Originator as A State
Press any key to continue . . .
cs

위의 예제에서는 메멘토 패턴의 오리지네이터(Originator) 객체와 메멘토(Memento) 객체를 정의하였다. 그리고 클라이언트가 케어테이커(Caretaker) 객체의 책임을 대신하였다.