CS/DesignPattern

(DesignPattern) 메멘토 패턴

주누 2020. 7. 26. 23:49

메멘토 패턴을 왜 쓰는가?

메멘토 패턴을 통해 객체의 상태를 저장하고 복구할 수 있다.

이때 접근 제한자 protected를 사용하여 외부의 접근을 제한할 수 있다.

실습

Memento

public class Memento {

    private String state;

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

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

Originator

public class Originator {

    private String state;

    public Memento createMemento() {
        return new Memento(state);
    }

    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }

    public String getState() {
        return state;
    }

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

CareTaker

public class Application {
    public static void main(String[] args) {

        Stack<Memento> mementos = new Stack<>();

        Originator originator = new Originator();

        originator.setState("state 1");
        mementos.push(originator.createMemento());

        originator.setState("state 2");
        mementos.push(originator.createMemento());

        originator.setState("state 3");
        mementos.push(originator.createMemento());

        originator.setState("state Final");
        mementos.push(originator.createMemento());

        // TODO: [state Final] junwoochoi 2020/07/26 11:20 오후
        originator.restoreMemento(mementos.pop());
        System.out.println(originator.getState());

        // TODO: [state 3] junwoochoi 2020/07/26 11:20 오후
        originator.restoreMemento(mementos.pop());
        System.out.println(originator.getState());

        // TODO: [state 2] junwoochoi 2020/07/26 11:20 오후
        originator.restoreMemento(mementos.pop());
        System.out.println(originator.getState());

        // TODO: [state 1] junwoochoi 2020/07/26 11:21 오후
        originator.restoreMemento(mementos.pop());
        System.out.println(originator.getState());

    }
}

실행결과

 

하나 이러 한식의 코딩은 외부에서 Memento를 수정할 수 있기에 위험할 수 있다.

 

이러 한식으로 변경해버리면 기대했던 값이 달라진다.

변경되어진 결과 값

 

이러한 이유로 Memento의 접근 제한자를 protected로 변경시켜야 하고 클라이언트 코드를 패키지 외부로 설정해야 한다.


Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/EffectiveStudy/src/main/java/me/designpattern/r_memento

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

References