메멘토 (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) 객체의 책임을 대신하였다.
'PROGRAMMING > Design Pattern' 카테고리의 다른 글
[GoF] 관찰자 (Observer) 패턴 (0) | 2019.03.09 |
---|---|
[GoF] 책임 연쇄 (Chain of Responsibility) 패턴 (0) | 2019.03.09 |
[GoF] 싱글턴 (Singleton) 패턴 (0) | 2019.03.09 |
[GoF] 프로토타입 (Prototype) 패턴 (0) | 2019.03.09 |
[GoF] 팩토리 메서드 (Factory Method) 패턴 (0) | 2019.03.09 |