備忘錄模式

前言

備忘錄模式通常不怎麼用,它也是一種行爲型設計模式。數據庫

目錄

1、定義

在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態,這樣之後就能夠將該對象恢復到原先保存的狀態。設計模式

2、模式原理分析

備忘錄模式包含兩個關鍵角色緩存

  • 原始對象(Originator):除了建立自身所須要的屬性和業務邏輯外,還經過提供方法 create()restore(memento) 來保存和恢復對象副本markdown

  • 備忘錄(Memento):用於保存原始對象的全部屬性狀態,以便在將來進行撤銷操做函數

下面舉的是單狀態備忘錄模式,多狀態就須要用到Map集合了。性能

//發起人角色
public class Originator{
    //內部狀態
    private String state = "";
    public String getState(){
        return state;
    }
    public void setState(String state){
        this.state = state;
    }
    //建立一個備忘錄
    public Memento createMemento(){
        return new Memento(this.state);
    }
    //恢復一個備忘錄
    public void restoreMemento(Memento _memento){
        this.setState(_memento.getState());
    }
}
//備忘錄角色
public class Memento{
    //發起人的內部狀態
    private String state = "";
    //構造函數
    public Memento(String _state){
        this.state = _state;
    }
    public String getState(){
        return state;
    }
    public void setState(String state){
        this.state = state;
    }
}
//備忘錄管理員角色
public class Caretaker{
    //備忘錄對象
    private Memento memento;
    public Memento getMemento(){
        return memento;
    }
    public void setMemento(Memento memento){
        this.memento = memento;
    }
}
//場景類
public class Client{
    public static void main(String[] args){
        //定義出發起人
        Originator originator = new Originator();
        //定義出備忘錄管理員
        Caretaker caretaker = new Caretaker();
        //建立一個備忘錄
        caretaker.setMemento(originator.createMemento());
        //恢復一個備忘錄
        originator.restoreMemento(caretaker.getMemento());
    }
}
複製代碼

3、使用場景

  • 須要保存一個對象在某一個時刻的狀態時刻this

  • 提供一個可回滾的操做,好比Word中的CTRL + Z 組合鍵spa

  • 須要監控的副本場景中。例如要監控一個對象的屬性,可是監控又不該該做爲系統的主業務來調用,能夠考慮備份一個副本,在子線程中分析處理線程

  • 數據庫鏈接的事務管理就是用的備忘錄模式設計

4、優勢

  • 可以快速撤消對對象狀態的更改

  • 可以提高代碼的擴展性。 備忘錄模式是經過增長外部對象來保存原始對象的狀態,而不是在原始對象中新增狀態記錄,當再也不須要保存對象狀態時就能很方便地取消這個對象。同理,新增備忘錄對象也很是容易

  • 可以幫助緩存記錄歷史對象狀態。好比,在客服會話聊天中,對於某一些重要的對話(退換貨、價保等),咱們會記錄這些對象數據,傳統的作法是調用一次服務接口,一旦服務出現故障就很容易致使聊天回覆速度變慢;而使用備忘錄模式則可以記錄這些重要的數據信息(用戶提供的訂單數據),而不須要反覆查詢接口,這樣能提高回覆客戶的效率

5、缺點

  • 備忘錄的生命週期,要主動去管理,釋放它們

  • 備忘錄的性能,備份太多,勢必對性能形成影響

相關文章
相關標籤/搜索