본문 바로가기
Theory/Design Pattern

Memento Pattern

by y.j 2022. 5. 21.
728x90

Memento Pattern

캡슐화를 위배하지 않고, object의 내부 state를 외부화하고 캡쳐해서 나중에 재사용하기 위해 사용한다. checkpoint나 undo를 구현하는데 용이하다.

object의 데이터 구조나 구현은 object내에 숨겨져 있고 보이지 않고 object 외부에서 접근할수도 없다. 문제점은 internal state를 object의 외부로스터 접근 없이 외부로 저장시키는 것이다. memento pattern은 internal state의 스냅샷을 저장해서 나중에 state를 재사용 할수 있도록 한다. 동시에 캡슐화는 위배하지 않는다.

* internal state : 모든 내부 데이터와 변수들 

 

Solution

Originator는 Memento의 현재 상태를 가지고 있는 객체이다. 

public class Originator {
    private String state;

    public Memento createMemento() {
        Memento memento = new Memento();
        memento.setState(state);
        return memento;
    }

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

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

    public String getState() {
        return state;
    }

    public class Memento {
        private String state;

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

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

restore를 통해 Memento의 이전이나 이후상태로 되돌릴 수 있다.

public class MementoPatternTest {

    @Test
    public void mementoPatternTest() {
        Originator originator = new Originator();

        Originator.Memento memento;

        List<Originator.Memento> mementos = new ArrayList<>();

        originator.setState("A");
        memento = originator.createMemento();
        mementos.add(memento);
        System.out.println("(1) Saving current state ...... : " + originator.getState());

        originator.setState("B");
        memento = originator.createMemento();
        mementos.add(memento);
        System.out.println("(2) Saving current state ...... : " + originator.getState());

        memento = mementos.get(0);
        originator.restore(memento);
        System.out.println("(3) Restoring to previous state : " + originator.getState());
    }
}

마지막 memento의 index 0번을 restore함으로써로 B -> A로 Originator의 상태를 바꾼다.

 

Advantages

• 캡슐화를 보전한다.


Disadvantages

• run-time비용이 발생한다.

 - mementos ( 코드상 List )가 클수록 memory사용이나 system 퍼포면스에 영향을 줄 수 있다.

 - Originator의 restore나 캡슐화 비용이 싸지 않으면 적절하지 않을 가능성이 있다.

[전체코드]

https://github.com/jKyounju/adapterPatterns/tree/master/src/BehavioralPattern/MementoPattern

https://github.com/jKyounju/adapterPatterns/blob/master/test/BehavioralPattern/MementoPatternTest.java

728x90

'Theory > Design Pattern' 카테고리의 다른 글

State Pattern  (0) 2022.05.21
Observer Pattern  (0) 2022.05.21
Mediator Pattern  (0) 2022.05.15
Iterator Pattern  (0) 2022.05.15
Interpreter Pattern  (0) 2022.05.14

댓글