メモモード


Memento パターンは、オブジェクトの特定の状態を保存し、適切なタイミングでオブジェクトを復元できるようにします。メモモードは動作モードです。

はじめに

目的: カプセル化を破壊することなく、オブジェクトの内部状態をキャプチャし、この状態をオブジェクトの外部に保存します。

主な解決策: いわゆるメモモードは、オブジェクトの内部状態をキャプチャし、カプセル化を破壊することなくこの状態をオブジェクトの外部に保存することで、将来オブジェクトを元の保存された状態に復元できるようにします。

いつ使用するか: 多くの場合、オブジェクトの内部状態を常に記録する必要があります。その目的は、ユーザーが不確かな操作や間違った操作をキャンセルして元の状態に戻せるようにすることです。薬」「食べられます。

解決方法: メモクラスを通じてオブジェクトの状態を特別に保存します。

キーコード: クライアントはメモクラスと結合されませんが、メモ管理クラスと結合されます。

応用例: 1.後悔の薬。 2. ゲームのプレイ中にファイルを保存します。 3. Windows の場合は ctri + z。 4. IE に戻ります。 4. データベーストランザクション管理。

利点: 1. ステータスを復元するメカニズムをユーザーに提供し、ユーザーが特定の過去のステータスに簡単に戻ることができるようにします。 2. 情報のカプセル化が実現されるため、ユーザーは状態保存の詳細を気にする必要がなくなります。

短所: リソースの消費。クラスのメンバー変数が多すぎると、必然的に比較的大きなリソースが占有され、保存するたびに一定量のメモリが消費されます。

使用シナリオ: 1. データの保存/復元が必要な関連ステータスのシナリオ。 2. ロールバック操作を提供します。

注: 1. Dimit 原則に準拠するには、管理メモ クラスを追加する必要があります。 2. メモリを節約するために、プロトタイプ モード + メモ モードを使用できます。

3つのクラス

Memento

OriginatorCareTakerを使用してメモパターンを実装します。 Memento には、復元するオブジェクトの状態が含まれます。 Originator は状態を作成し、Memento オブジェクトに保存します。 Caretaker オブジェクトは、Memento からオブジェクトの状態を復元する責任があります。

MementoPatternDemo、私たちのデモクラスはCareTakerOriginatorオブジェクトを使用してオブジェクトの状態復元を表示します。

memento_pattern_uml_diagram.jpg

ステップ 1

Memento クラスを作成します。

Memento.java

public class Memento {
   private String state;

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

   public String getState(){
      return state;
   }	
}

ステップ 2

Originator クラスを作成します。

Originator.java

public class Originator {
   private String state;

   public void setState(String state){
      this.state = state;
   }

   public String getState(){
      return state;
   }

   public Memento saveStateToMemento(){
      return new Memento(state);
   }

   public void getStateFromMemento(Memento Memento){
      state = Memento.getState();
   }
}

ステップ 3

CareTaker クラスを作成します。

CareTaker.java

import java.util.ArrayList;
import java.util.List;

public class CareTaker {
   private List<Memento> mementoList = new ArrayList<Memento>();

   public void add(Memento state){
      mementoList.add(state);
   }

   public Memento get(int index){
      return mementoList.get(index);
   }
}

ステップ 4

CareTaker オブジェクトと Originator オブジェクトを使用します。

MementoPatternDemo.java

public class MementoPatternDemo {
   public static void main(String[] args) {
      Originator originator = new Originator();
      CareTaker careTaker = new CareTaker();
      originator.setState("State #1");
      originator.setState("State #2");
      careTaker.add(originator.saveStateToMemento());
      originator.setState("State #3");
      careTaker.add(originator.saveStateToMemento());
      originator.setState("State #4");

      System.out.println("Current State: " + originator.getState());		
      originator.getStateFromMemento(careTaker.get(0));
      System.out.println("First saved State: " + originator.getState());
      originator.getStateFromMemento(careTaker.get(1));
      System.out.println("Second saved State: " + originator.getState());
   }
}

ステップ 5

出力を確認します。

りー