CS/DesignPattern
(DesignPattern) 메멘토 패턴
주누
2020. 7. 26. 23:49
메멘토 패턴을 왜 쓰는가?
메멘토 패턴을 통해 객체의 상태를 저장하고 복구할 수 있다.
이때 접근 제한자 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