「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java の Memento デザイン パターンを理解する

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

2024 年 8 月 7 日に公開
ブラウズ:925

Understanding the Memento Design Pattern in Java

問題

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

解決

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

  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