Skip to content

Latest commit

 

History

History
93 lines (63 loc) · 2.69 KB

File metadata and controls

93 lines (63 loc) · 2.69 KB

메멘토 패턴은 객체를 이전 상태로 되돌릴 수 있는 기능을 제공하는 소프트웨어 디자인 패턴이다. 현재(원본) 상태를 저장하는 객체인 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에 저장하여 가져오는 동작을 수행할 수 있다.

링크로 가면 코드를 볼 수 있다.