본문 바로가기

개인공부/소프트웨어 개발 패턴

Memento 메멘토 패턴(행동패턴)

메멘토 패턴은 OOP의 캡슐화에 위배되지 않는 선에서 객체의 내부정보를 바깥에서 조작할 수 있게 하는 패턴이다.

 

 

 

Originator.class

public 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();
    }
}
  • Originator : 현재 State를 가지고, Memento 객체와 Memento 객체 상태를 얻게 한다



Memento class

public class Memento {
    private String state;

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

    public String getState(){
        return state;
    }
}

  • Memento : State를 가지고 있는 인스턴스



CareTaker.class

public class CareTaker {
    private List<Memento> mementoList = new ArrayList<Memento>();

    public void add(Memento state){
        mementoList.add(state);
    }

    public Memento get(int index){
        return mementoList.get(index);
    }
}
  • CareTaker : Memento를 순서대로 저장한다



Main.class

 public static void main(String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();
        originator.setState("State #1");
        originator.setState("State #2");
        careTaker.add(originator.saveStateToMemento());
        originator.setState("State #3");
        careTaker.add(originator.saveStateToMemento());
        originator.setState("State #4");

        System.out.println("Current State: " + originator.getState());
        originator.getStateFromMemento(careTaker.get(0));
        System.out.println("First saved State: " + originator.getState());
        originator.getStateFromMemento(careTaker.get(1));
        System.out.println("Second saved State: " + originator.getState());
    }

 

>>>Current State: State #4
>>>First saved State: State #2
>>>Second saved State: State #3
  • 저장한 status를 불러올 수 있다



장단점


  • 장점
    • 저장된 상태를 핵심 객체와는 다른 별도의 객체에 보관하기 때문에 안전하다
    • 핵심 객체의 데이터를 계속해서 캡슐화된 상태로 유지할 수 있다
    • 복구 기능을 구현하기 쉽다
  • 단점
    • 이전 상태의 객체를 저장하기 위한 Originator가 클 경우 많은 메모리가 필요하다
    • 상태를 저장하고 복구하는 데 시간이 오래 걸리 수 있다
      • 자바 시스템에서는 시스템의 상태를 저장할 때 직렬화를 사용하는 것이 좋다