Java デザインパターン プログラミングにおけるメモ パターンとその実装の詳細な説明

高洛峰
リリース: 2017-01-19 15:37:56
オリジナル
1264 人が閲覧しました

1. 定義
カプセル化を破壊することなく、オブジェクトの内部状態をキャプチャし、この状態をオブジェクトの外部に保存します。これにより、後でオブジェクトを元の保存状態に復元できます。

2. 使用理由
オブジェクトをある時点の元の状態に戻したい。

3. 適用可能な状況の例
メモ モードの応用例は数多くありますが、これまでに見たことはありますが、メモ モードの使用については考えたことはありません。 jsp+javabean:
システムにアカウントを追加する場合、一部のフィールドが入力されていないか、正しく入力されていない場合は、ユーザー名、パスワード、連絡先番号、住所などの情報をフォームに入力する必要があります。ユーザーが「送信」ボタンをクリックすると、新しいページでユーザーが入力したオプションを保存し、エラー オプションを入力する必要があります。これは、JavaBean のscope="request" またはscope="session" 特性を使用することによって、つまりメモ モードを使用することによって実現されます。
例2.車のブレーキを修理するとき。まずは両側のバッフルを外し、左右のブレーキパッドを露出させます。 1 つの部分のみを取り外すことができ、もう 1 つの部分はブレーキの取り付け方法を示すために役立ちます。この部分の修理が完了したら、もう一方の部分を取り外すことができます。 2枚目が外れると1枚目がメモになります。
例3. 人生に後悔の薬はないと言われますが、私たちは自分のしたことに対して必ず代償を払っていますが、ソフトの世界では、何かのステータスを変えた後に「後悔の薬」が存在します。事前に保存しておけば、ある状態であればメモモードでその状態を復元することができます。実は、これは時間を巻き戻すことができる「月光の宝箱」ではありません。それは常に「魔法」です。及び4. クラス図の構造と説明
(1) 以下に示すクラス図:


(2) クラスの説明 Java デザインパターン プログラミングにおけるメモ パターンとその実装の詳細な説明 (i) memenTo: メモの役割、主な担当作業は次のとおりです。スポンサー オブジェクトのターゲットになります。内部状態が保存されます。

その内容が発信元オブジェクト以外のオブジェクトによって読み取られるのを防ぐことができます。

(ii) 発信者: 発信者の役割は主に次のタスクを実行します:
現在の内部状態を含むメモ オブジェクトを作成します。
内部状態を保存するためにメモ オブジェクトを使用します。
(iii) 管理者: 責任者の役割。次のように作業を完了します。
メモ オブジェクトの保存を担当します。
メモ オブジェクトの内容は保存しません。

5. 例

/**
 * 数据对象
 */
public class DataState {
  private String action;
  
  public void setAction(String action) {
    this.action = action;
  }
    
  public String getAction() {
    return action;
  }
ログイン後にコピー
/**
 * 一个保存另外一个对象内部状态拷贝 的对象.这样以后就可以将该对象恢复到原先保存的状态.
 */
import java.io.File;
import java.io.Serializable;
  
public class Memento implements Serializable {
  
  /*private int number;
  private File file = null;
  
  public Memento(Originator o) {
    this.number = o.getNumber();
    this.file = o.getFile();
  }
  
  public int getNumber() {
    return this.number;
  }
  
  public void setNumber(int number) {
    this.number = number;
  }
  
  public File getFile() {
    return this.file;
  }
  
  public void setFile(File file) {
    this.file = file;
  }
*/
  private DataState state;
  public Memento(Originator o) {
    this.state = o.getState();
  }
    
  public DataState getState() {
    return state;
  }
    
  public void setState(DataState state) {
    this.state = state;
  }
}
ログイン後にコピー

public class Originator {
  
/* private int number;
  private File file = null;
  
  public Originator() {
  
  }
  
  // 创建一个Memento,将自身作为参数传入
  public Memento getMemento() {
    return new Memento(this);
  }
  
  // 从Memento中取出保存的数据,恢复为原始状态
  public void setMemento(Memento m) {
    number = m.getNumber();
    file = m.getFile();
  }
  
  public int getNumber() {
    return number;
  }
  
  public void setNumber(int number) {
    this.number = number;
  }
  
  public File getFile() {
    return file;
  }
  
  public void setFile(File file) {
    this.file = file;
  }*/
    
  private DataState state;
  public Originator() {
      
  }
    
  public Originator(DataState state) {
    this.state = state;
  }
    
  // 创建一个Memento,将自身作为参数传入
  public Memento getMemento() {
    return new Memento(this);
  }
    
  // 从Memento中取出保存的数据,恢复为原始状态
  public void setMemento(Memento m) {
    /*
     * getMemento() 创建的对象,保存在某个容器里,
     * 当需要恢复时,将其传入当前方法, 再使用getState(),得出
     */
    this.state = m.getState();
  }
    
  public DataState getState() {
    return state;
  }
    
  public void setState(DataState state) {
    this.state = state;
  }
}
ログイン後にコピー
/*
 * Originator用于 加载数据, 建立Memento对象,及通过Memento恢复原始数据
 */
public class Test {
  public static void main(String[] args) {
      
//   Originator originator = new Originator();
//   originator.setNumber(8);
//   
//   Memento memento = originator.getMemento();
//   System.out.println(memento.getNumber());
      
    DataState state = new DataState();
    state.setAction("copy a character");
    Originator originator = new Originator();
    System.out.println("创建原始数据");
    originator.setState(state);
      
    System.out.println("创建备忘录对象, 保存原始数据状态");
    Memento memento = originator.getMemento();
      
    System.out.println("创建了一个新数据");
    originator.setState(new DataState());
  
    System.out.println("创建新数据后:" + originator.getState().getAction());
      
    /*
     * memento 需要保存在某地,需要时取出,以恢复它内部所保存的数据
     */
    System.out.println("创建新数据后,恢复原数据");
    originator.setMemento(memento);
    System.out.println(originator.getState().getAction());
  }
}
ログイン後にコピー


印刷:

创建原始数据
创建备忘录对象, 保存原始数据状态
创建了一个新数据
创建新数据后:null
创建新数据后,恢复原数据
copy a character
ログイン後にコピー

Java デザイン パターン プログラミングにおけるメモ パターンとその実装の詳細については、PHP 中国語 Web サイトに注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート