Memento Pattern 이란?

  • 특정 시점에서의 객체 내부 상태를 객체화함으로써 이후 요청에 따라 객체를 해당 시점의 상태로 돌릴 수 있는 기능
  • Ctrl + Z

  • Originator : 현재 상태를 표현하는 State를 가지고 있으며, Memento 객체를 통해 현재 상태를 변경
  • Memento : Originator의 상태를 나타내는 클래스, Memento를 이용하여 Originator의 상태를 변경
  • CareTaker : Memento를 순서대로 저장하여 관리하는 클래스, Stack이나 List 같은 자료구조 사용

메멘토 패턴 구현

Originator - 현재 상태를 표현하는 State를 가지고 있으며, Memento 객체를 통해 현재 상태를 변경

package BehavioralPattern.Memento;

public class Originator {
    private String state;
    
    public Memento createMemento() {
        return new Memento(state);
    }
    
    public void restoreMemonto(Memento memento){
        this.state = memento.getState();
    }

    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

Memento - Originator의 상태를 나타내는 클래스, Memento를 이용하여 Originator의 상태를 변경

package BehavioralPattern.Memento;

public class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return this.state;
    }
}

CareTaker - Memento를 순서대로 저장하여 관리하는 클래스, Stack 이나 List 같은 자료구조 사용

  • 해당 예시에서는 클래스로 따로 빼지 않고 자료구조를 이용하여 사용
package BehavioralPattern.Memento;

import java.util.Stack;

public class Client {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Stack<Memento> mementos = new Stack<>();

        originator.setState("A");
        mementos.push(originator.createMemento());

        originator.setState(originator.getState()+"B");
        mementos.push(originator.createMemento());

        originator.setState(originator.getState()+"C");
        mementos.push(originator.createMemento());

        originator.setState(originator.getState()+"D");
        mementos.push(originator.createMemento());

        while (!mementos.isEmpty()) {
            originator.restoreMemonto(mementos.pop());
            System.out.println(originator.getState());
        }
    }
}

+ Recent posts