Java Design Pattern - Memento Pattern

업데이트:

Design Pattern

  • 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다.
  • 디자인 패턴은 알고리즘이 아니라 상황에 따라 자주 쓰이는 설계 방법을 정리한 코딩 방법론일 뿐이며 모든 상황의 해결책이 아니다.

Behavioral Patterns, 행위 패턴

  • 객체간의 상호작용과 책임을 중시하는 패턴이다.
  • 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하면서 객체 사이의 결합도를 최소화하는 것에 중점을 두는 패턴이다.

Memento Pattern

  • 객체를 이전의 상태로 복구시켜야 하는 경우 사용하는 패턴이다.

Example

public class Memento {

  private String state;

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

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

}
  • 객체의 상태를 저장하기 위한 Memento 객체를 구현한다.
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();
  }

}
public class CareTaker {

  private List<Memento> mementoList = new ArrayList<Memento>();

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

  public Memento get(int index) {
    return this.mementoList.get(index);
  }

}
  • 이전 상태로 복원하기 위해 이력을 저장 및 복원 기능을 포함한 Originator 객체와 이력을 관리하는 CareTaker 객체를 구현한다.
public class MementoPatternMain {

  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());
  }

}
  • 상태를 변경시키며 저장을 원하면 Originator 객체를 사용하여 현재 객체의 상태를 저장하고, CareTaker 객체에 이력을 저장시켜 필요 시 복원 가능하도록 한다.
  • 이력 저장과 상태 변경을 다수 실행하고, CareTaker 객체에서 기존 이력을 Originator 객체로 복원하여 출력해본다.

Source

Sample Code는 여기에서 확인 가능합니다.

댓글남기기