"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Java의 Memento 디자인 패턴 이해

Java의 Memento 디자인 패턴 이해

2024-08-07에 게시됨
검색:817

Understanding the Memento Design Pattern in Java

문제

Memento 패턴은 캡슐화를 위반하지 않고 객체의 내부 상태를 캡처하고 복원해야 하는 필요성을 해결합니다. 이는 실행 취소/다시 실행 기능을 구현하여 개체를 이전 상태로 되돌리려는 시나리오에 유용합니다.

해결책

Memento 패턴에는 세 가지 주요 구성 요소가 포함됩니다.

  1. Originator: 내부 상태를 저장하고 복원해야 하는 개체입니다.
  2. Memento: 발신자의 내부 상태를 저장하는 객체입니다. 기념품은 변경할 수 없습니다.
  3. 관리인: 작성자에게 기념품의 상태를 저장하거나 복원하도록 요청하는 역할을 담당합니다.

발신자는 현재 상태의 스냅샷이 포함된 기념품을 만듭니다. 이 기념품은 관리자가 저장하고 필요할 때 작성자의 상태를 복원하는 데 사용할 수 있습니다.

장점과 단점

장점

  • 캡슐화 유지: 구현 세부 정보를 노출하지 않고 객체의 내부 상태를 저장하고 복원할 수 있습니다.
  • 간단한 실행 취소/다시 실행: 실행 취소/다시 실행 기능 구현을 촉진하여 시스템을 더욱 강력하고 사용자 친화적으로 만듭니다.
  • 상태 기록: 개체의 이전 상태 기록을 유지하여 여러 상태 간 탐색을 가능하게 합니다.

단점

  • 메모리 소비: 여러 기념품을 저장하면 특히 개체의 상태가 큰 경우 상당한 메모리를 소비할 수 있습니다.
  • 추가 복잡성: 기념품 생성 및 복원을 관리해야 하므로 코드가 더욱 복잡해집니다.
  • 관리인의 책임: 관리인은 기념품을 효율적으로 관리해야 하며, 이로 인해 시스템에 책임과 복잡성이 추가될 수 있습니다.

실제 적용 사례

Memento 패턴의 실용적인 예는 실행 취소/다시 실행 기능을 제공하는 텍스트 편집기에 있습니다. 문서의 각 변경 사항은 기념품으로 저장될 수 있으므로 사용자는 필요에 따라 문서의 이전 상태로 되돌릴 수 있습니다.

Java의 예제 코드

코드의 메모 패턴:

// Originator
public class Editor {
    private String content;

    public void setContent(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public Memento save() {
        return new Memento(content);
    }

    public void restore(Memento memento) {
        content = memento.getContent();
    }

    // Memento
    public static class Memento {
        private final String content;

        public Memento(String content) {
            this.content = content;
        }

        private String getContent() {
            return content;
        }
    }
}

// Caretaker
public class History {
    private final Stack history = new Stack();

    public void save(Editor editor) {
        history.push(editor.save());
    }

    public void undo(Editor editor) {
        if (!history.isEmpty()) {
            editor.restore(history.pop());
        }
    }
}

// Client code
public class Client {
    public static void main(String[] args) {
        Editor editor = new Editor();
        History history = new History();

        editor.setContent("Version 1");
        history.save(editor);
        System.out.println(editor.getContent());

        editor.setContent("Version 2");
        history.save(editor);
        System.out.println(editor.getContent());

        editor.setContent("Version 3");
        System.out.println(editor.getContent());

        history.undo(editor);
        System.out.println(editor.getContent());

        history.undo(editor);
        System.out.println(editor.getContent());
    }
}
릴리스 선언문 이 글은 https://dev.to/diegosilva13/understanding-the-memento-design-pattern-in-java-2c72?1에서 복제됩니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3