Java メモ パターンを利用してオブジェクトの状態を保存および復元するにはどうすればよいですか?

PHPz
リリース: 2023-05-08 20:07:39
転載
918 人が閲覧しました

はじめに

Memento パターンは、カプセル化を破壊することなくオブジェクトの内部状態をキャプチャして保存し、後でオブジェクトを以前の状態に復元できるようにする動作設計パターンです。 pattern は、オブジェクトの内部状態を保存する Memento クラスです。

Java では、Memento クラスを定義することで Memento パターンを実装できます。Memento クラスには通常、内部状態を保存するための 1 つ以上のプライベート フィールドが含まれています保存するオブジェクトのオブジェクト。Memo クラスは、これらのフィールドを取得および設定するためのパブリック メソッドも提供します。元のオブジェクトは、Memo クラスを使用してメモを作成し、履歴に保存できます。オブジェクトの状態が必要な場合復元する場合、元のオブジェクトは履歴レコードからメモを取得し、そのメモを使用してその状態を復元できます。

メモ モードでは、通常、次の 3 つの役割が関係します。

  • オリジネーター (イニシエーター): 状態が保存されるオブジェクトです。メモを作成および復元するためのインターフェイスを提供し、他のオブジェクトがその内部状態を取得できるようにします。

  • Memento (メモ): Originator の内部状態を保存するためのオブジェクトです。Memento は、Originator の必要に応じて内部状態を保存し、Originator 以外のオブジェクトが状態にアクセスできないようにすることができます。

  • Caretaker (マネージャー): メモを保存し、必要に応じて復元のために作成者に提供する責任があります。Caretaker は複数のメモを保存し、複数の元に戻す操作をサポートできます。

Java でメモ モードを実装する場合、通常は上記 3 つの役割が関係します。Originator と Memento が必要であり、Caretaker は実際のニーズに応じて実装するかどうかを選択できます。

#実装

#アタック(攻撃力)、ディフェンス(防御力)、HP(体力値)の3つの属性を持つゲームキャラクタークラスRoleがあるとして、キャラクターのステータスを保存して更新できるメモモードを実装したいと思います。必要に応じてそれを実行します。 キャラクターのステータスを復元します。

メモクラス

@Data
public class Memento {
    /**
     * 攻击力
     */
    private int attack;
    /**
     * 防御力
     */
    private int defense;
    /**
     * 生命值
     */
    private int hp;
    public Memento(int attack, int defense, int hp) {
        this.attack = attack;
        this.defense = defense;
        this.hp = hp;
    }
}
ログイン後にコピー

開始ヒューマン

@Data
public class Role {
    /**
     * 攻击力
     */
    private int attack;
    /**
     * 防御力
     */
    private int defense;
    /**
     * 生命值
     */
    private int hp;
    public Role(int attack, int defense, int hp) {
        this.attack = attack;
        this.defense = defense;
        this.hp = hp;
    }
    /**
     * 将当前对象储存值Memento中
     * @return
     */
    public Memento save(){
        return new Memento(attack,defense,hp);
    }
    /**
     * 从memento中获取状态;并恢复到当前状态
     * @param memento
     */
    public void restore(Memento memento){
        attack = memento.getAttack();
        defense = memento.getDefense();
        hp = memento.getHp();
    }
}
ログイン後にコピー

マネージャークラス

public class Caretaker {
    private List<Memento> mementos = new ArrayList<>();
    public void addMemento(Memento m){
        mementos.add(m);
    }
    public Memento getMemento(int index){
        return mementos.get(index);
    }
}
ログイン後にコピー

テスト

public class Demo {
    public static void main(String[] args) {
        Role role = new Role(100,50,20);
        Caretaker caretaker = new Caretaker();
        Memento memento = role.save();
        caretaker.addMemento(memento);
        // 攻击力+10
        role.setAttack(role.getAttack()+10);
        System.out.println(JSON.toJSONString(role));
        // 恢复
        role.restore(caretaker.getMemento(0));
        System.out.println(JSON.toJSONString(role));
    }
}
ログイン後にコピー

Java メモ パターンを利用してオブジェクトの状態を保存および復元するにはどうすればよいですか?これはメモ モードの完全な例です。この例では、キャラクターの攻撃力、防御力、体力を保存するメモ クラス Memento を作成します。また、ロール クラス role も作成します。キャラクターの状態を保存したり復元したりできる「Caretaker」クラスを作成し、Memento オブジェクトを保存することで、メモモードを実装しました。

#利点

オブジェクトの状態を保存および復元できるため、オブジェクトの状態の変更がより柔軟かつ制御可能になります。

  • このモードは実装が簡単で、理解も使用も簡単です。

  • #メモ オブジェクトと元のオブジェクトは、システムのカプセル化を確実にするために分離されています。
  • 欠点
  • 保存する状態データの量が比較的多い場合、メモオブジェクトが大きなメモリ空間を占有する可能性があります。 ##保存する必要がある状態が比較的頻繁に発生する場合、メモ オブジェクトの管理がより複雑になる可能性があります。

#アプリケーション シナリオ
  • テキスト エディタでの元に戻す操作など、前の状態にロールバックできるように、オブジェクトの状態の履歴を保存する必要があります。
  • オブジェクトの状態が変更されるシナリオデータベースでのトランザクション管理など、バックアップと復元が必要です。

ゲーム内などの後続の分析と統計を実行しながら、オブジェクトの状態のスナップショットを実装する必要があるアーカイブおよび再生機能。
  • つまり、Java メモ モードは、状態を保存および復元する必要があるオブジェクトに適しています。シナリオは、開発者がオブジェクトのステータスの変更をより適切に管理し、オブジェクトの状態を改善するのに役立ちます。システムの柔軟性と制御性。

以上がJava メモ パターンを利用してオブジェクトの状態を保存および復元するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!