이전 값을 저장해뒀다가 나중에 재사용 하는 패턴
ctrl + z 와 같은 기능 수행
1. 코드
Note : 글을 쓰는 note 클래스
public class Note {
private String text = "";
public void addText(String newText) {
text += newText;
}
public Memento makeMemento() {
return new Memento(text);
}
public void undo(Memento memento) {
this.text = memento.getText();
}
public String getText() {
return this.text;
}
}
Memento : 과거의 값들을 저장하는 클래스
public class Memento {
private String text;
public Memento(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
Main : 테스트 클래스
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Note note = new Note();
Stack<Memento> stack = new Stack<>();
boolean doText = true;
while (doText) {
char order = sc.next().charAt(0);
switch (order) {
case 'a': // 글쓰기
String text = sc.next();
note.addText(text);
break;
case 's': // 저장
stack.add(note.makeMemento());
break;
case 'u': // 되돌리기
if (!stack.empty()) {
note.undo(stack.pop());
}
break;
case 'p': // 출력
System.out.println(note.getText());
break;
case 'e': // 종료
doText = false;
break;
}
}
}
}
2. 특징
- main에서 과거 데이터를 저장하고 되돌리는 시점을 관리하는 일을 담당
- note에서 과거 데이터를 생성하고 되돌리는 일을 담당
- note 클래스 안에서 memento 객체를 관리하지 않고 main에서 관리하는 이유는 역할을 분담하기 위함
- note 클래스 안에서 memento 객체를 관리하는 구조도 나빠 보이진 않음
3. 해당 패턴을 고려해볼만한 상황
- 되돌리기 기능
'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글
State 패턴 (0) | 2021.03.14 |
---|---|
Observer 패턴 (0) | 2021.02.21 |
Mediator 패턴 (0) | 2021.02.14 |
Facade 패턴 (0) | 2021.02.12 |
Chain Of Responsibility 패턴 (0) | 2021.02.11 |