본문 바로가기
CS(Computer Science)지식/[C++] 디자인 패턴

메멘토 패턴(Memento Pattern)이해하기 : 쉽게 설명한 디자인 패턴(C++)

by 엔지니어 청년 2024. 1. 29.

메멘토 패턴(Memento Pattern)이란?


메멘토 패턴은 객체의 상태를 저장하고 이전 상태로 복원할 수 있는 디자인 패턴입니다. 이 패턴은 객체의 내부 상태를 캡슐화하지 않고 외부 객체에 저장하고 복원할 수 있게 해줍니다. 이 패턴은 주로 '실행 취소' 기능을 구현할 때 사용됩니다.

메멘토 패턴은 세 가지 주요 구성 요소로 이루어져 있습니다:

  1. Originator: 상태를 저장하고 복원할 수 있는 객체입니다.
  2. Memento: Originator의 상태를 저장하는 객체입니다.
  3. 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는 상태를 저장하고 복원할 수 있는 객체입니다. MementoOriginator의 상태를 저장하는 객체입니다. CaretakerMemento를 저장하고 관리하는 객체입니다.

클래스 다이어그램


    +-----------------+
    |    Memento      |
    +-----------------+
    | getState        |
    +-----------------+
            ^
            |
    +-----------------+     +-----------------+
    |   Originator    |     |   Caretaker    |
    +-----------------+     +-----------------+
    | set             |     | saveState       |
    | saveToMemento   |     | restoreState    |
    | restoreFromMemento |  +-----------------+
    +-----------------+

이 패턴을 사용하면 객체의 상태를 저장하고 이전 상태로 복원하는 기능을 쉽게 구