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());
}
}
}