備忘錄模式(Memento)

一、概念

備忘錄模式在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態,以便恢復到原先保存的狀態,屬於行爲型模式。 bash

備忘錄模式

二、模式結構

  • 發起人角色(Originator):記錄當前時刻的內部狀態,負責定義哪些屬於備份的狀態,負責建立和恢復備忘錄數據
  • 備忘錄角色(Memento):負責存儲Originator發起人對象的內部狀態 ,在須要的時候提供發起人須要的內部狀態
  • 備忘錄管理員角色(Caretaker):對備忘錄進行管理、保存和提供備忘錄

三、使用場景

  • 須要保存一個對象在某一個時刻的狀態或者部分狀態
  • 若是用一個接口來讓其餘對象獲得這些狀態,將會暴露這個對象的實現細節並破壞對象的的封裝性,一個對象不但願外界直接訪問其內部狀態,經過中間對象能夠間接訪問其內部狀態

四、優缺點

優勢:ui

  • 把複雜的發起人內部信息對其餘的對象屏蔽起來,從而能夠恰當地保持封裝的邊界
  • 給用戶提供了一種能夠恢復狀態的機制,能夠使用戶可以比較方便地回到某個歷史的狀態

缺點:this

  • 須要完整的存儲備忘錄,資源消耗過大

五、實例

定義發起人角色Game 類spa

public class Game {
    private int level = 1;
    private int coin = 0;


    public void upgrade() {
        level++;
        coin += level * 100;
    }


    public void  exit(){
        // 退出遊戲邏輯
    }

    public Memento createMemento() {
        return new Memento(level, coin);
    }

    public void setMemento(Memento memento) {
        this.level = memento.getLevel();
        this.coin = memento.getCoin();
    }
}
複製代碼

定義備忘錄角色Mementocode

public class Memento {

    private int level;//等級
    private int coin;//金幣數量

    public Memento(int level, int coin) {
        this.level = level;
        this.coin = coin;
    }

    public int getCoin() {
        return coin;
    }

    public int getLevel() {
        return level;
    }
}
複製代碼

定義備忘錄管理員角色Caretakercdn

public class Caretaker {
    private Memento memento;

    public void setMemento(Memento memento) {
        this.memento = memento;
    }

    public Memento getMemento() {
        return memento;
    }
}
複製代碼

客戶端調用對象

Game game = new Game();
game.upgrade();
Memento memento = game.createMemento();//建立存檔
Caretaker caretaker = new Caretaker();
caretaker.setMemento(memento);//保存存檔
game.exit();//退出遊戲

Game secondGame = new Game();
secondGame.setMemento(caretaker.getMemento());//讀取存檔
複製代碼
相關文章
相關標籤/搜索