前言
這次要介紹的是備忘錄模式,也是行為模式的一種 。現在人們的智能手機上都會有備忘錄這樣一個功能,大家也都會用,就是為了記住某件事情,防止以後自己忘記了。那麼備忘錄模式又是什麼樣子的呢?是不是和手機上的備忘錄一樣呢?下面來介紹一下。
備忘錄模式
概念介紹
備忘錄模式是指在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态。這樣以後就可以将該對象恢複到原先儲存的狀态。簡單的來說就是平時玩的通關遊戲,第一次前進了5步,第二次前進時踩到便便了,然後要回到之前的進度。例如下圖結構:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZlBnaucjY0EmYyImY3gTZ3QWM3UWZ0UGMjBzM5UjZwczMjdDNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpeg)
舉例
我們還是用一個小例子來簡單介紹一下備忘錄模式,在玩一個步驟遊戲時,每走一步時步數都加一,遇到道具可以快速走幾步,或者減幾步。用備忘錄模式的思想來實作這個邏輯,就是如下代碼。
遊戲類
/**
* 遊戲 */@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方法。看完了這個小例子,大概應該知道備忘錄模式是個什麼邏輯了吧,有點類似咱們平時知道的事務復原的機制。下面還是分析一下,備忘錄模式都是由哪些部分組成的。
備忘錄模式結構
結構圖如下
備忘錄模式的構成角色如下所示。
原發器類(Originator):建立一個備忘錄對象,使用備忘錄存儲它的内部狀态。
負責人類(CareTaker):負責儲存好備忘錄對象,不能檢查或操作備忘錄的内容。
備忘錄類(Memento):将原發器的内部狀态存儲起來,原發器根據需要決定備忘錄存儲原發器的哪些内部狀态。
總結
優點
1、它提供了一種狀态恢複的實作機制,使得使用者可以友善地回到一個特定的曆史步驟,當新的狀态無效或者存在問題時,可以使用暫時存儲起來的備忘錄将狀态複原。
2、備忘錄實作了對資訊的封裝,一個備忘錄對象是一種原發器對象狀态的表示,不會被其他代碼所改動。備忘錄儲存了原發器的狀态,采用清單、堆棧等集合來存儲備忘錄對象可以實作多次撤銷操作。
缺點
資源消耗過大,如果需要儲存的原發器類的成員變量太多,就不可避免需要占用大量的存儲空間,每儲存一次對象的狀态都需要消耗一定的系統資源。
适用場景
1、儲存一個對象在某一個時刻的全部狀态或部分狀态,這樣以後需要時它能夠恢複到先前的狀态,實作撤銷操作。
2、防止外界對象破壞一個對象曆史狀态的封裝性,避免将對象曆史狀态的實作細節暴露給外界對象。