ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 행동(Behavioral) - 메멘토(Memento) 패턴
    Java/디자인패턴 2024. 11. 22. 17:38
    반응형

    메멘토(Memento) 패턴

    메멘토(Memento) 패턴행동(Behavioral) 패턴에 속합니다. 이 패턴은 객체의 상태를 저장하고, 이후 필요 시 저장된 상태로 복원할 수 있도록 하는 데 사용됩니다. 주로 Undo/Redo 기능을 구현하거나, 객체의 상태를 특정 시점으로 복원해야 하는 경우에 유용합니다.


    메멘토 패턴의 특징

    1. 상태 캡슐화:
      • 객체의 상태를 외부에서 직접 접근하지 않고, 메멘토 객체를 통해 캡슐화하여 저장합니다.
    2. 복원 기능 제공:
      • 저장된 메멘토를 사용하여 객체를 이전 상태로 되돌릴 수 있습니다.
    3. 정보 은닉:
      • 메멘토 객체는 원래 객체의 내부 상태를 캡슐화하며, 이를 보호하기 위해 Originator(원본 객체)만 상태를 저장하고 복원할 수 있습니다.

    메멘토 패턴의 구성요소

    1. Memento (메멘토):
      • Originator 객체의 내부 상태를 저장하며, 해당 상태를 복원할 수 있도록 지원합니다.
    2. Originator (원본 객체):
      • 상태를 저장하거나 복원하는 객체입니다.
    3. 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

    메멘토 패턴의 활용 사례

    1. Undo/Redo 기능:
      • 텍스트 편집기, 그래픽 소프트웨어 등에서 작업 상태를 저장하고 복원.
    2. 게임 상태 저장:
      • 게임 진행 중 플레이어의 상태(체력, 위치, 장비 등)를 저장.
    3. 트랜잭션 복구:
      • 데이터베이스 시스템에서 작업 중 오류 발생 시 이전 상태로 복구.

    장점

    1. Undo/Redo 지원:
      • 상태를 저장하고 복원할 수 있어 작업 실행 취소와 재실행이 쉬워집니다.
    2. 정보 캡슐화:
      • 메멘토 객체를 통해 상태를 보호하면서도 외부에서 관리 가능합니다.
    3. 객체 상태 관리 용이:
      • 객체의 특정 시점 상태를 유지하고 복원할 수 있습니다.

    단점

    1. 메모리 사용 증가:
      • 상태를 자주 저장하면 많은 메멘토 객체가 생성되어 메모리 사용이 증가할 수 있습니다.
    2. 객체 상태 복잡성 증가:
      • Originator의 상태가 복잡할수록 메멘토도 복잡해질 수 있습니다.
    3. 관리자 책임 증가:
      • Caretaker가 여러 메멘토를 관리해야 하므로 코드가 복잡해질 수 있습니다.
    반응형

    댓글

Designed by Tistory.