본문 바로가기

디자인 패턴/Java언어로 배우는 디자인패턴 입문 책 정리

Memento 패턴

이전 값을 저장해뒀다가 나중에 재사용 하는 패턴

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