메멘토 패턴은 객체를 이전 상태로 되돌릴 수 있는 기능을 제공하는 소프트웨어 디자인 패턴이다. 현재(원본) 상태를 저장하는 객체인 Originator에서 특정 상태를 저장하는 Memento 객체로 변환하여 CareTaker에 저장하는 구조이며, 핵심 객체의 데이터를 계속해서 캡슐화된 상태로 유지하는 것이 특징이다.
@Getter
@Setter
public class Originator {
private String state;
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
현재 상태를 담고있는 객체인 Originator이다. 새 Memento를 생성하거나 Memento로부터 정보를 받아와 상태를 변경하는 메서드를 가지고있다.
@Getter
@AllArgsConstructor
public class Memento {
private String state;
}
특정 시점의 상태를 저장하는 Memento 객체이다.
public class CareTaker {
private List<Memento> mementoList = new ArrayList<>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
Memento를 List형태로 저장하고있는 CareTaker이다. 새로운 Memento를 저장하거나 꺼내오는 메서드를 가지고 있다.
public class App {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("state1");
originator.setState("state2");
careTaker.add(originator.saveStateToMemento());
originator.setState("state3");
careTaker.add(originator.saveStateToMemento());
originator.setState("state4");
careTaker.add(originator.saveStateToMemento());
System.out.println("현재 상태 : " + originator.getState());
System.out.println("첫 번째 저장 : " + careTaker.get(0).getState());
System.out.println("두 번째 저장 : " + careTaker.get(1).getState());
originator.getStateFromMemento(careTaker.get(0)); // 두번째 저장으로 Rollback
System.out.println("롤백 후 상태 : " + originator.getState());
}
}
이와 같이 상태를 careTaker에 저장하여 가져오는 동작을 수행할 수 있다.
이 링크로 가면 코드를 볼 수 있다.