메멘토 패턴 (Memento)
메멘토 패턴(Memento Pattern)은 객체의 캡슐화를 파괴하지 않고 객체의 내부 상태를 추출하여 저장(Snapshot)해 두었다가, 나중에 객체를 그 상태로 복구(Restore)할 수 있게 해주는 행위 패턴입니다.
우리가 에디터에서 자주 쓰는 Ctrl+Z (실행 취소)가 정확히 메멘토 패턴입니다. 게임의 '세이브/로드' 시스템도 마찬가지입니다. 상태를 저장하는 객체(Originator)가 자신의 상태를 담은 암호 상자(Memento)를 만들어 관리인(Caretaker)에게 맡겨두고, 필요할 때 상자를 돌려받아 과거로 회귀합니다.
// Memento (저장소 객체)
class Memento {
private String state;
public Memento(String state) { this.state = state; }
public String getState() { return state; }
}
// Originator (저장할 상태를 가진 객체)
class Originator {
private String state;
public void setState(String state) { this.state = state; }
public String getState() { return state; }
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
// Caretaker (Memento 관리자)
class CareTaker {
private java.util.List<Memento> mementoList = new java.util.ArrayList<>();
public void add(Memento state) { mementoList.add(state); }
public Memento get(int index) { return mementoList.get(index); }
}
public class Main {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("상태 #1");
originator.setState("상태 #2");
careTaker.add(originator.saveStateToMemento()); // 2 저장
originator.setState("상태 #3");
careTaker.add(originator.saveStateToMemento()); // 3 저장
originator.setState("상태 #4");
System.out.println("현재 상태: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0)); // 2로 복구
System.out.println("첫번째 복구 상태: " + originator.getState());
}
}