프로그래밍/GoF

[행동 패턴] - 메멘토(Memento)

MAKGA 2022. 1. 8. 00:46
320x100

구조

#pragma once

#include <iostream>
#include <string>

class Memento
{
private:
    const std::string str1_;
    const std::string str2_;

public:
    Memento(std::string& str1, std::string& str2)
        : str1_(str1)
        , str2_(str2)
    {
    }

    const std::string& getStr1() const
    {
        return str1_;
    }

    const std::string& getStr2() const
    {
        return str2_;
    }
};

class Originator
{
private:
    std::string str1_;
    std::string str2_;

public:
    Originator(const char* str1, const char* str2)
    {
        str1_ = str1;
        str2_ = str2;
    }

    Memento* createMemento()
    {
        return new Memento(str1_, str2_);
    }

    void setMememto(Memento* memento)
    {
        str1_ = memento->getStr1();
        str2_ = memento->getStr2();
    }

    void set(const char* str1, const char* str2)
    {
        str1_ = str1;
        str2_ = str2;
    }
};

class Caretaker
{
public:
    Caretaker(Originator* originator)
    {
        memento_ = originator->createMemento();
        originator->setMememto(memento_);
    }

    Memento* getMemento()
    {
        return memento_;
    }

private:
    Memento* memento_;
};

 

사용

int main()
{
    Originator* original = new Originator("First", "One");
    Caretaker* caretaker = new Caretaker(original);

    // 새로운 상태
    original->set("Second", "Two");

    // 이전 상태로 복구
    original->setMememto(caretaker->getMemento());

    system("pause");

    return 0;
}

 

특정 객체(originator)의 상태(Memento)를 다른 곳(Caretaker)에 저장해두고 다른 값으로 사용하다가, 필요할 떄 복구할 수 있는 패턴이다.

 

320x100