행위 패턴(Behavioral Pattern)
메멘토 패턴(Memento Pattern)은 소프트웨어 디자인 패턴 중 하나로, 객체의 상태를 저장하고 나중에 복원할 수 있는 메커니즘을 제공합니다.
이 패턴은 보통 다음과 같은 상황에서 사용됩니다. 어떤 객체의 상태를 변경하고, 이 변경 내용을 이후에 취소하거나 이전 상태로 복원하려고 할 때, 상태를 저장하고 복원하는 과정을 간편하게 처리할 수 있습니다.
메멘토 패턴은 세 가지 주요 구성 요소로 이루어져 있습니다. 첫째, Originator는 상태를 저장하고 복원하려는 객체입니다. 둘째, Memento(메멘토)는 상태를 저장하는 객체입니다. 셋째, Caretaker는 Memento를 저장하고 관리하는 객체입니다.
이 패턴을 사용하면, Originator 객체의 상태를 Memento에 저장하고, 이후에 복원할 수 있습니다. Memento 객체는 Originator 객체 외부에서 직접적으로 접근할 수 없으며, Caretaker 객체를 통해서만 접근할 수 있습니다. 따라서, 상태를 안전하게 보호하면서도 필요한 경우에만 복원할 수 있습니다.
이 패턴은 복잡한 상태를 가진 객체에서 매우 유용합니다. 예를 들어, 텍스트 편집기에서 사용자가 작성한 문서의 상태를 저장하고 이전 상태로 복원하는 경우, 메멘토 패턴을 사용할 수 있습니다. 또한, 게임에서 플레이어의 게임 상태를 저장하고 이전 상태로 복원하는 경우에도 이 패턴을 사용할 수 있습니다.
Memento 패턴 예제
Diagrams
이 예제에서는 텍스트 에디터의 상태를 저장하고 복원하는 기능을 구현할 것입니다.
먼저, Originator 클래스를 만들어보겠습니다. 이 클래스는 상태를 저장하고 복원할 객체입니다.
public class TextEditor {
private String text;
public TextEditor() {
this.text = "";
}
public void write(String text) {
this.text += text;
}
public void print() {
System.out.println(this.text);
}
public Memento save() {
return new Memento(this.text);
}
public void restore(Memento memento) {
this.text = memento.getState();
}
}
다음으로, Memento 클래스를 만들어보겠습니다. 이 클래스는 상태를 저장하는 객체입니다.
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return this.state;
}
}
마지막으로, Caretaker 클래스를 만들어보겠습니다. 이 클래스는 Memento를 저장하고 관리하는 객체입니다.
public class Caretaker {
private List<Memento> mementos = new ArrayList<>();
public void addMemento(Memento memento) {
this.mementos.add(memento);
}
public Memento getMemento(int index) {
return this.mementos.get(index);
}
}
이제 이를 활용해 텍스트 에디터의 상태를 저장하고 복원하는 예제를 만들어보겠습니다.
public class Main {
public static void main(String[] args) {
TextEditor editor = new TextEditor();
Caretaker caretaker = new Caretaker();
editor.write("Hello, ");
caretaker.addMemento(editor.save()); // 현재 상태 저장
editor.write("world!");
caretaker.addMemento(editor.save()); // 현재 상태 저장
editor.write(" Goodbye!");
editor.print(); // Hello, world! Goodbye!
editor.restore(caretaker.getMemento(1)); // 이전 상태로 복원
editor.print(); // Hello, world!
}
}
이 예제에서는 TextEditor 클래스가 Originator 역할을 하고, Memento 클래스가 Memento 역할을 합니다. 또한, Caretaker 클래스가 Memento를 저장하고 관리하는 역할을 합니다.
이 예제를 실행하면, "Hello, world! Goodbye!" 라는 문자열이 출력되고, 이전 상태로 복원하면 "Hello, world!" 라는 문자열이 출력됩니다. 이를 통해 메멘토 패턴이 어떻게 동작하는지 이해할 수 있습니다.
'JAVA > 디자인 패턴' 카테고리의 다른 글
[Design Pattern] State(상태) 패턴이란? (0) | 2023.05.11 |
---|---|
[Design Pattern] Observer(옵저버) 패턴이란? (0) | 2023.05.11 |
[Design Pattern] Mediator(중재자) 패턴이란? (0) | 2023.05.08 |
[Design Pattern] Iterator(반복자) 패턴이란? (0) | 2023.05.08 |
[Design Pattern] Interpreter(인터프리터) 패턴이란? (0) | 2023.05.08 |