-
행동(Behavioral) - 메멘토(Memento) 패턴Java/디자인패턴 2024. 11. 22. 17:38반응형
메멘토(Memento) 패턴
메멘토(Memento) 패턴은 행동(Behavioral) 패턴에 속합니다. 이 패턴은 객체의 상태를 저장하고, 이후 필요 시 저장된 상태로 복원할 수 있도록 하는 데 사용됩니다. 주로 Undo/Redo 기능을 구현하거나, 객체의 상태를 특정 시점으로 복원해야 하는 경우에 유용합니다.
메멘토 패턴의 특징
- 상태 캡슐화:
- 객체의 상태를 외부에서 직접 접근하지 않고, 메멘토 객체를 통해 캡슐화하여 저장합니다.
- 복원 기능 제공:
- 저장된 메멘토를 사용하여 객체를 이전 상태로 되돌릴 수 있습니다.
- 정보 은닉:
- 메멘토 객체는 원래 객체의 내부 상태를 캡슐화하며, 이를 보호하기 위해 Originator(원본 객체)만 상태를 저장하고 복원할 수 있습니다.
메멘토 패턴의 구성요소
- Memento (메멘토):
- Originator 객체의 내부 상태를 저장하며, 해당 상태를 복원할 수 있도록 지원합니다.
- Originator (원본 객체):
- 상태를 저장하거나 복원하는 객체입니다.
- Caretaker (관리자):
- Memento 객체를 관리하며, 메멘토를 저장하고 필요 시 복원을 요청합니다.
JAVA 예제
1. Memento 클래스
// Memento: 객체 상태를 저장 class Memento { private final String state; public Memento(String state) { this.state = state; } public String getState() { return state; } }
2. Originator 클래스
// Originator: 상태를 저장하거나 복원 class Originator { private String state; public void setState(String state) { System.out.println("Setting state to: " + state); this.state = state; } public String getState() { return state; } // 상태를 저장하는 메멘토 생성 public Memento saveToMemento() { System.out.println("Saving state to Memento."); return new Memento(state); } // 메멘토에서 상태 복원 public void restoreFromMemento(Memento memento) { state = memento.getState(); System.out.println("Restored state from Memento: " + state); } }
3. Caretaker 클래스
import java.util.ArrayList; import java.util.List; // Caretaker: 메멘토 관리 class Caretaker { private List<Memento> mementoList = new ArrayList<>(); public void addMemento(Memento memento) { mementoList.add(memento); } public Memento getMemento(int index) { return mementoList.get(index); } }
4. 사용 예시
public class MementoPatternExample { public static void main(String[] args) { Originator originator = new Originator(); Caretaker caretaker = new Caretaker(); // 상태 변경 및 저장 originator.setState("State #1"); caretaker.addMemento(originator.saveToMemento()); originator.setState("State #2"); caretaker.addMemento(originator.saveToMemento()); originator.setState("State #3"); System.out.println("Current State: " + originator.getState()); // 이전 상태 복원 originator.restoreFromMemento(caretaker.getMemento(0)); originator.restoreFromMemento(caretaker.getMemento(1)); } }
실행 결과
Setting state to: State #1 Saving state to Memento. Setting state to: State #2 Saving state to Memento. Setting state to: State #3 Current State: State #3 Restored state from Memento: State #1 Restored state from Memento: State #2
메멘토 패턴의 활용 사례
- Undo/Redo 기능:
- 텍스트 편집기, 그래픽 소프트웨어 등에서 작업 상태를 저장하고 복원.
- 게임 상태 저장:
- 게임 진행 중 플레이어의 상태(체력, 위치, 장비 등)를 저장.
- 트랜잭션 복구:
- 데이터베이스 시스템에서 작업 중 오류 발생 시 이전 상태로 복구.
장점
- Undo/Redo 지원:
- 상태를 저장하고 복원할 수 있어 작업 실행 취소와 재실행이 쉬워집니다.
- 정보 캡슐화:
- 메멘토 객체를 통해 상태를 보호하면서도 외부에서 관리 가능합니다.
- 객체 상태 관리 용이:
- 객체의 특정 시점 상태를 유지하고 복원할 수 있습니다.
단점
- 메모리 사용 증가:
- 상태를 자주 저장하면 많은 메멘토 객체가 생성되어 메모리 사용이 증가할 수 있습니다.
- 객체 상태 복잡성 증가:
- Originator의 상태가 복잡할수록 메멘토도 복잡해질 수 있습니다.
- 관리자 책임 증가:
- Caretaker가 여러 메멘토를 관리해야 하므로 코드가 복잡해질 수 있습니다.
반응형'Java > 디자인패턴' 카테고리의 다른 글
패턴은 행동(Behavioral) - 책임 연쇄(Chain of Responsibility) 패턴 (0) 2024.11.24 생성 패턴(Creational Pattern) - 프로토타입(Prototype) 패턴 (0) 2024.11.23 행동(Behavioral) - 커맨드(Command) 패턴 (0) 2024.11.21 구조 패턴(Structural Pattern) - 데코레이터(Decorator) 패턴 (0) 2024.11.20 생성 패턴(Creational Pattern) - 빌더(Builder) 패턴 (0) 2024.11.19 - 상태 캡슐화: