天天看點

Java單體應用 - 架構模式 - 03.設計模式-19.備忘錄模式備忘錄模式

原文位址: http://www.work100.net/training/monolithic-architecture-design-patterns-memento-pattern.html 更多教程: 光束雲 - 免費課程

備忘錄模式

序号 文内章節 視訊
1 概述 -
2 實作

請參照如上

章節導航

進行閱讀

1.概述

備忘錄模式(

Memento Pattern

)儲存一個對象的某個狀态,以便在适當的時候恢複對象。備忘錄模式屬于行為型模式。

意圖:

在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态。

主要解決:

所謂備忘錄模式就是在不破壞封裝的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态,這樣可以在以後将對象恢複到原先儲存的狀态。

何時使用:

很多時候我們總是需要記錄一個對象的内部狀态,這樣做的目的就是為了允許使用者取消不确定或者錯誤的操作,能夠恢複到他原先的狀态,使得他有"後悔藥"可吃。

如何解決:

通過一個備忘錄類專門存儲對象狀态。

關鍵代碼:

客戶不與備忘錄類耦合,與備忘錄管理類耦合。

應用執行個體:

  • 後悔藥。
  • 打遊戲時的存檔。
  • Windows 裡的

    ctrl

    +

    z

  • IE 中的後退。
  • 資料庫的事務管理。

優點:

  • 給使用者提供了一種可以恢複狀态的機制,可以使使用者能夠比較友善地回到某個曆史的狀态。
  • 實作了資訊的封裝,使得使用者不需要關心狀态的儲存細節。

缺點:

消耗資源。如果類的成員變量過多,勢必會占用比較大的資源,而且每一次儲存都會消耗一定的記憶體。

使用場景:

  • 需要儲存/恢複資料的相關狀态場景。
  • 提供一個可復原的操作。

注意事項:

  • 為了符合迪米特原則,還要增加一個管理備忘錄的類。
  • 為了節約記憶體,可使用原型模式+備忘錄模式。

2.實作

備忘錄模式使用三個類

Memento

Originator

CareTaker

Memento

包含了要被恢複的對象的狀态。

Originator

建立并在

Memento

對象中存儲狀态。

Caretaker

對象負責從

Memento

中恢複對象的狀态。

MementoPatternDemo

,我們的示範類使用

CareTaker

Originator

對象來顯示對象的狀态恢複。

步驟 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

執行程式,輸出結果:

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

上一篇:

中介者模式

下一篇:

觀察者模式
如果對課程内容感興趣,可以掃碼關注我們的

公衆号

QQ群

,及時關注我們的課程更新
Java單體應用 - 架構模式 - 03.設計模式-19.備忘錄模式備忘錄模式
Java單體應用 - 架構模式 - 03.設計模式-19.備忘錄模式備忘錄模式