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

前言

此次要介紹的是備忘錄模式,也是行爲模式的一種 。如今人們的智能手機上都會有備忘錄這樣一個功能,你們也都會用,就是爲了記住某件事情,防止之後本身忘記了。那麼備忘錄模式又是什麼樣子的呢?是否是和手機上的備忘錄同樣呢?下面來介紹一下。html

備忘錄模式 

概念介紹

備忘錄模式是指在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就能夠將該對象恢復到原先保存的狀態。簡單的來講就是平時玩的通關遊戲,第一次前進了5步,第二次前進時踩到便便了,而後要回到以前的進度。例以下圖結構:設計模式

 

舉例

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

遊戲類學習

/**
 * 遊戲
 */
@Data
public 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();
    }
}

備份測試

/**
 * 備份
 */
@Getter
public class GameMemento {
    /** 步數 */
    private int playerSteps;

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

}

備份信息管理類this

/**
 * 備份信息管理類
 */
public class Caretaker {
    /** 備份 */
    private GameMemento gameMemento;
    /** 恢復備份 */
    public GameMemento retrieveMemento(){
        return this.gameMemento;
    }
    /** 保存備份 */
    public void saveMemento(GameMemento gameMemento){
        this.gameMemento = gameMemento;
    }
}

測試url

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());

    }

}

運行結果spa

遊戲開始,撿到滑板,前進10步
備份當前狀態
備份完成
踩到便便了,當前步數爲:0
還原到以前一步
恢復完成,當前玩家步數是:10

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

備忘錄模式結構

結構圖以下設計

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

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

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

備忘錄類(Memento):將原發器的內部狀態存儲起來,原發器根據須要決定備忘錄存儲原發器的哪些內部狀態。

總結

優勢

一、它提供了一種狀態恢復的實現機制,使得用戶能夠方便地回到一個特定的歷史步驟,當新的狀態無效或者存在問題時,能夠使用暫時存儲起來的備忘錄將狀態復原。

二、備忘錄實現了對信息的封裝,一個備忘錄對象是一種原發器對象狀態的表示,不會被其餘代碼所改動。備忘錄保存了原發器的狀態,採用列表、堆棧等集合來存儲備忘錄對象能夠實現屢次撤銷操做。

缺點 

資源消耗過大,若是須要保存的原發器類的成員變量太多,就不可避免須要佔用大量的存儲空間,每保存一次對象的狀態都須要消耗必定的系統資源。

適用場景

一、保存一個對象在某一個時刻的所有狀態或部分狀態,這樣之後須要時它可以恢復到先前的狀態,實現撤銷操做。

二、防止外界對象破壞一個對象歷史狀態的封裝性,避免將對象歷史狀態的實現細節暴露給外界對象。

 

 

 

 

想了解更多的設計模式請查看Java設計模式學習記錄-GoF設計模式概述

相關文章
相關標籤/搜索