ホームページ  >  記事  >  Java  >  Java の Memento デザイン パターンを理解する

Java の Memento デザイン パターンを理解する

王林
王林オリジナル
2024-07-24 16:06:57453ブラウズ

Understanding the Memento Design Pattern in Java

問題

Memento パターンは、カプセル化に違反することなくオブジェクトの内部状態をキャプチャして復元する必要性に対処します。これは、オブジェクトを以前の状態に戻すことができる、元に戻す/やり直し機能を実装するシナリオで役立ちます。

解決

Memento パターンには 3 つの主要なコンポーネントが含まれます:

  1. オリジネーター: 内部状態を保存および復元する必要があるオブジェクト。
  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<Editor.Memento> 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());
    }
}

以上がJava の Memento デザイン パターンを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。