메멘토 패턴(Memento Pattern)이란?
메멘토 패턴은 객체의 상태를 저장하고 이전 상태로 복원할 수 있는 디자인 패턴입니다. 이 패턴은 객체의 내부 상태를 캡슐화하지 않고 외부 객체에 저장하고 복원할 수 있게 해줍니다. 이 패턴은 주로 '실행 취소' 기능을 구현할 때 사용됩니다.
메멘토 패턴은 세 가지 주요 구성 요소로 이루어져 있습니다:
- Originator: 상태를 저장하고 복원할 수 있는 객체입니다.
- Memento: Originator의 상태를 저장하는 객체입니다.
- Caretaker: Memento를 저장하고 관리하는 객체입니다.
예시 코드
다음은 C++로 작성된 간단한 메멘토 패턴의 예입니다.
#include <iostream>
#include <memory>
#include <stack>
// Memento
class Memento {
public:
explicit Memento(int state) : state(state) {}
int getState() const { return state; }
private:
int state;
};
// Originator
class Originator {
public:
void set(int state) {
std::cout << "Originator: Setting state to " << state << std::endl;
this->state = state;
}
std::unique_ptr<Memento> saveToMemento() {
std::cout << "Originator: Saving to Memento." << std::endl;
return std::make_unique<Memento>(state);
}
void restoreFromMemento(const Memento* memento) {
state = memento->getState();
std::cout << "Originator: State after restoring from Memento: " << state << std::endl;
}
private:
int state;
};
// Caretaker
class Caretaker {
public:
void saveState(Originator* originator) {
std::cout << "Caretaker: Saving Originator's state." << std::endl;
mementoStack.push(originator->saveToMemento());
}
void restoreState(Originator* originator) {
if (!mementoStack.empty()) {
std::cout << "Caretaker: Restoring Originator's state." << std::endl;
originator->restoreFromMemento(mementoStack.top().get());
mementoStack.pop();
}
}
private:
std::stack<std::unique_ptr<Memento>> mementoStack;
};
int main() {
Originator originator;
Caretaker caretaker;
originator.set(1);
caretaker.saveState(&originator);
originator.set(2);
caretaker.saveState(&originator);
originator.set(3);
caretaker.restoreState(&originator);
return 0;
}
위 코드에서 Originator는 상태를 저장하고 복원할 수 있는 객체입니다. Memento는 Originator의 상태를 저장하는 객체입니다. Caretaker는 Memento를 저장하고 관리하는 객체입니다.
클래스 다이어그램
+-----------------+
| Memento |
+-----------------+
| getState |
+-----------------+
^
|
+-----------------+ +-----------------+
| Originator | | Caretaker |
+-----------------+ +-----------------+
| set | | saveState |
| saveToMemento | | restoreState |
| restoreFromMemento | +-----------------+
+-----------------+
이 패턴을 사용하면 객체의 상태를 저장하고 이전 상태로 복원하는 기능을 쉽게 구
'CS(Computer Science)지식 > [C++] 디자인 패턴' 카테고리의 다른 글
템플릿 메서드 패턴(Template Method Pattern)이해하기 : 쉽게 설명한 디자인 패턴(C++) (2) | 2024.01.29 |
---|---|
상태 패턴(State Pattern)이해하기 : 쉽게 설명한 디자인 패턴(C++) (0) | 2024.01.29 |
해석자 패턴(Interpreter Pattern) 이해하기 : 쉽게 설명한 디자인 패턴(C++) (0) | 2024.01.29 |
명령 패턴(Command Pattern) 이해하기 : 쉽게 설명한 디자인 패턴(C++) (0) | 2024.01.29 |
책임 연쇄 패턴(Chain of Reponsibility Design Pattern) 이해하기 : 쉽게 설명한 디자인 패턴(C++) (0) | 2024.01.29 |