메멘토 패턴을 왜 쓰는가?
메멘토 패턴을 통해 객체의 상태를 저장하고 복구할 수 있다.
이때 접근 제한자 protected를 사용하여 외부의 접근을 제한할 수 있다.
실습
Memento
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return this.state;
}
}
Originator
public class Originator {
private String state;
public Memento createMemento() {
return new Memento(state);
}
public void restoreMemento(Memento memento) {
this.state = memento.getState();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
CareTaker
public class Application {
public static void main(String[] args) {
Stack<Memento> mementos = new Stack<>();
Originator originator = new Originator();
originator.setState("state 1");
mementos.push(originator.createMemento());
originator.setState("state 2");
mementos.push(originator.createMemento());
originator.setState("state 3");
mementos.push(originator.createMemento());
originator.setState("state Final");
mementos.push(originator.createMemento());
// TODO: [state Final] junwoochoi 2020/07/26 11:20 오후
originator.restoreMemento(mementos.pop());
System.out.println(originator.getState());
// TODO: [state 3] junwoochoi 2020/07/26 11:20 오후
originator.restoreMemento(mementos.pop());
System.out.println(originator.getState());
// TODO: [state 2] junwoochoi 2020/07/26 11:20 오후
originator.restoreMemento(mementos.pop());
System.out.println(originator.getState());
// TODO: [state 1] junwoochoi 2020/07/26 11:21 오후
originator.restoreMemento(mementos.pop());
System.out.println(originator.getState());
}
}
하나 이러 한식의 코딩은 외부에서 Memento를 수정할 수 있기에 위험할 수 있다.
이러 한식으로 변경해버리면 기대했던 값이 달라진다.
이러한 이유로 Memento의 접근 제한자를 protected로 변경시켜야 하고 클라이언트 코드를 패키지 외부로 설정해야 한다.
Code Link
References
'CS > DesignPattern' 카테고리의 다른 글
(DesignPattern) FrontController - Version02 (View 분리) (0) | 2021.05.02 |
---|---|
(DesignPattern) FrontController 패턴이란? (with FrontController - Version01) (0) | 2021.04.29 |
패턴 정리 (템플릿, 팩토리, 추상팩토리) (0) | 2020.06.18 |
패턴 정리 (브릿지, 어댑터, 전략) (0) | 2020.06.18 |
(DesignPattern) 퍼사드 패턴 (0) | 2020.06.07 |