天天看點

Java設計模式學習記錄-備忘錄模式

前言

這次要介紹的是備忘錄模式,也是行為模式的一種 。現在人們的智能手機上都會有備忘錄這樣一個功能,大家也都會用,就是為了記住某件事情,防止以後自己忘記了。那麼備忘錄模式又是什麼樣子的呢?是不是和手機上的備忘錄一樣呢?下面來介紹一下。

備忘錄模式

概念介紹

備忘錄模式是指在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态。這樣以後就可以将該對象恢複到原先儲存的狀态。簡單的來說就是平時玩的通關遊戲,第一次前進了5步,第二次前進時踩到便便了,然後要回到之前的進度。例如下圖結構:

Java設計模式學習記錄-備忘錄模式

舉例

我們還是用一個小例子來簡單介紹一下備忘錄模式,在玩一個步驟遊戲時,每走一步時步數都加一,遇到道具可以快速走幾步,或者減幾步。用備忘錄模式的思想來實作這個邏輯,就是如下代碼。

遊戲類

 /**
  * 遊戲 */@Datapublic class Game {
  /**      * 玩家走的步數     */
  private int playerStep;
  /**
   * 備份遊戲
   * @return
   */
  public GameMemento createGameMemento(){
  return new GameMemento(playerStep);
  }
  
  /**
   * 開始玩遊戲     */
  public void play(){
  playerStep = 0;
  }
  /**
   * 恢複備份
   * @param gameMemento     */
  public void restore(GameMemento gameMemento){
      this.playerStep = gameMemento.getPlayerSteps();
       }}      

備份

 /**
  * 備份 */@Getterpublic class GameMemento {
 /** 步數 */
  private int playerSteps;
 /**
  * 備份步數
  * @param playerSteps
  */     public GameMemento(int playerSteps){
     this.playerSteps = playerSteps;
   }}      

備份資訊管理類

/**
  * 備份資訊管理類 */public class Caretaker {
    /** 備份 */
     private GameMemento gameMemento;
    /** 恢複備份 */
     public GameMemento retrieveMemento(){
    return this.gameMemento;
    }
    /** 儲存備份 */
     public void saveMemento(GameMemento gameMemento){
       this.gameMemento = gameMemento;
    }}      

測試

public class Player {
     public static void main(String[] args) {
        Game game = new Game();
        System.out.println("遊戲開始,撿到滑闆,前進10步");
        game.setPlayerStep(10);
        //備份目前狀态
        System.out.println("備份目前狀态");
        GameMemento gameMemento = game.createGameMemento();
        Caretaker caretaker = new Caretaker();
        caretaker.saveMemento(gameMemento);
        System.out.println("備份完成");
        game.play();
        System.out.println("踩到便便了,目前步數為:"+game.getPlayerStep());
        System.out.println("還原到之前一步");         
        game.restore(caretaker.retrieveMemento());         
        System.out.println("恢複完成,目前玩家步數是:"+game.getPlayerStep());
   }}      

運作結果

遊戲開始,撿到滑闆,前進10步備份目前狀态備份完成踩到便便了,目前步數為:0還原到之前一步恢複完成,目前玩家步數是:10      

上面的這個例子使用了lombok插件的注解例如:@Getterhe@Data是以少寫了getter和setter方法。看完了這個小例子,大概應該知道備忘錄模式是個什麼邏輯了吧,有點類似咱們平時知道的事務復原的機制。下面還是分析一下,備忘錄模式都是由哪些部分組成的。

備忘錄模式結構

結構圖如下

Java設計模式學習記錄-備忘錄模式

備忘錄模式的構成角色如下所示。

原發器類(Originator):建立一個備忘錄對象,使用備忘錄存儲它的内部狀态。

負責人類(CareTaker):負責儲存好備忘錄對象,不能檢查或操作備忘錄的内容。

備忘錄類(Memento):将原發器的内部狀态存儲起來,原發器根據需要決定備忘錄存儲原發器的哪些内部狀态。

總結

優點

1、它提供了一種狀态恢複的實作機制,使得使用者可以友善地回到一個特定的曆史步驟,當新的狀态無效或者存在問題時,可以使用暫時存儲起來的備忘錄将狀态複原。

2、備忘錄實作了對資訊的封裝,一個備忘錄對象是一種原發器對象狀态的表示,不會被其他代碼所改動。備忘錄儲存了原發器的狀态,采用清單、堆棧等集合來存儲備忘錄對象可以實作多次撤銷操作。

缺點

資源消耗過大,如果需要儲存的原發器類的成員變量太多,就不可避免需要占用大量的存儲空間,每儲存一次對象的狀态都需要消耗一定的系統資源。

适用場景

1、儲存一個對象在某一個時刻的全部狀态或部分狀态,這樣以後需要時它能夠恢複到先前的狀态,實作撤銷操作。

2、防止外界對象破壞一個對象曆史狀态的封裝性,避免将對象曆史狀态的實作細節暴露給外界對象。