메멘토 패턴은 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가 클 경우 많은 메모리가 필요하다
- 상태를 저장하고 복구하는 데 시간이 오래 걸리 수 있다
- 자바 시스템에서는 시스템의 상태를 저장할 때 직렬화를 사용하는 것이 좋다
'개인공부 > 소프트웨어 개발 패턴' 카테고리의 다른 글
| Observer 옵저버 패턴(행동패턴) (1) | 2024.10.25 |
|---|---|
| State 스테이트 패턴(행동패턴) (0) | 2024.10.22 |
| (구조패턴)Decorator 데코레이터 패턴 (1) | 2024.10.18 |
| (구조패턴) Bridge 브릿지 패턴 (0) | 2024.10.17 |
| (구조패턴) Adapter 어댑터 패턴 (2) | 2024.10.17 |