Mod memo


Memento Pattern menyimpan keadaan objek tertentu supaya objek itu boleh dipulihkan pada masa yang sesuai. Mod memo ialah mod tingkah laku.

Pengenalan

Niat: Tangkap keadaan dalaman objek dan simpan keadaan ini di luar objek tanpa memusnahkan enkapsulasi.

Penyelesaian utama: Mod memo yang dipanggil adalah untuk menangkap keadaan dalaman objek tanpa memusnahkan enkapsulasi, dan menyimpan keadaan ini di luar objek, supaya objek boleh digunakan kemudian Pulihkan kepada keadaan asal yang disimpan.

Bila menggunakan: Banyak kali kita sentiasa perlu merekodkan keadaan dalaman objek Tujuannya adalah untuk membolehkan pengguna membatalkan operasi yang tidak pasti atau salah dan memulihkan kepada asalnya keadaannya memberinya "ubat penyesalan" untuk dimakan.

Cara menyelesaikan: Simpan khas keadaan objek melalui kelas memo.

Kod kunci: Pelanggan tidak digabungkan dengan kelas memo, tetapi digabungkan dengan kelas pengurusan memo.

Contoh aplikasi: 1. 2. Simpan fail semasa bermain permainan. 3. ctri + z dalam Windows. 4. Kembali ke IE. 4. Pengurusan transaksi pangkalan data.

Kelebihan: 1 Ia menyediakan pengguna dengan mekanisme untuk memulihkan keadaan, yang membolehkan pengguna kembali ke keadaan sejarah tertentu dengan lebih mudah. 2. Enkapsulasi maklumat direalisasikan supaya pengguna tidak perlu mengambil berat tentang butiran menyelamatkan negeri.

Kelemahan: Penggunaan sumber. Jika kelas mempunyai terlalu banyak pembolehubah ahli, ia pasti akan menduduki sumber yang agak besar, dan setiap simpanan akan menggunakan jumlah memori tertentu.

Senario penggunaan: 1. 2. Sediakan operasi rollback.

Nota: 1 Untuk mematuhi prinsip Dimit, kelas untuk menguruskan memo mesti ditambah. 2. Untuk menjimatkan memori, anda boleh menggunakan mod prototaip + mod memo.

Melaksanakan

mod Memento menggunakan tiga kelas Memento, Originator dan CareTaker. Memento mengandungi keadaan objek yang akan dipulihkan. Originator mencipta dan menyimpan keadaan dalam objek Memento. Objek Penjaga bertanggungjawab untuk memulihkan keadaan objek daripada Memento.

MementoPatternDemo, kelas demo kami menggunakan objek CareTaker dan Originator untuk memaparkan pemulihan keadaan objek.

memento_pattern_uml_diagram.jpg

Langkah 1

Buat kelas Memento.

Memento.java

public class Memento {
   private String state;

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

   public String getState(){
      return state;
   }	
}

Langkah 2

Buat kelas 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();
   }
}

Langkah 3

Buat kelas 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);
   }
}

Langkah 4

Gunakan objek CareTaker dan 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());
   }
}

Langkah 5

Sahkan output.

Current State: State #4
First saved State: State #2
Second saved State: State #3