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는 여기에서 확인 가능합니다.
댓글남기기