java備忘錄模式 | 如何記錄歷史信息

519951628599605_.pic.jpg

這是我參與8月更文挑戰的第10天,活動詳情查看:8月更文挑戰java

歡迎來到今天的學習,今天咱們一塊兒來學習下不怎麼經常使用的一種模式-----備忘錄模式。多嘮叨幾句,我本月將會對java的設計模式精講,歡迎點擊頭像,關注個人專欄,我會持續更新,加油!程序員

系列文章:數據庫

設計模式之單例模式設計模式

設計模式之工廠模式markdown

設計模式之建造者模式post

設計模式之代理模式單元測試

設計模式之訪問者模式學習

設計模式之適配器模式測試

設計模式之命令者模式this

java狀態模式 | 隨時隨地監控狀態改變

java觀察者模式 | 如何通知事物的變化

...持續更新中

話很少說,進入正題

備忘錄模式

相比較其餘幾種模式而言,備忘錄模式不怎麼經常使用。該模式我認爲用起來你感受簡單,理解起來也沒有那麼抽象,因此本節應該是比較簡單的一節。

官方定義是:捕獲並外部化對象的內部狀態,以便之後能夠恢復。

能夠理解成copy,複製出一套東西,咱們程序員最經常使用的可能就是數據庫的備份等。這個備忘錄雖然表面字眼稱之爲備忘錄,可是更多的就是理解爲「備份模式」。

咱們看下簡單的類圖

image.png

從該圖中,咱們能看出備忘錄模式包含兩個關鍵角色。

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

  • 備忘錄(Memento):用於保存原始對象的全部屬性狀態,以便在將來進行撤銷操做(我的理解,就是備份容器對象,將要備份的東西放到這裏)。

下面咱們首先來看看上圖中 對應的代碼實現。,而後再結合業務來實現。首先,咱們建立原始對象 Originator,對象中有四個屬性,分別是 state 用於顯示當前對象狀態,name、用來模擬業務屬性

public class Originator {
    private String state = "原始對象";  //打印當前狀態
    private String name;
    public Originator() {
    }
    //省略get、set方法


    //備份(備忘錄)
    public Memento create() {
        return new Memento(name);
    }
    
    //撤銷返回
    public void restore(Memento m) {
        this.state = m.getState();
        this.name = m.getName();
    }
   
}
複製代碼

而後,再來建立備忘錄對象 Memento,你會發現備忘錄對象幾乎就和原始對象的屬性如出一轍。

public class Memento {
    private String state = "從備份對象恢復爲原始對象";  //打印當前狀態
    private String name;
    public Memento(String name) {
        this.name = name;
    }
    //省略get、set方法
}
複製代碼
public class Demo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.setName("張三");
        System.out.println(originator);
        Memento memento = originator.create();
        originator.setName("李四");
        System.out.println(originator);
        originator.restore(memento);
        System.out.println(originator);
    }
}
複製代碼

下面咱們看下具體場景實現

場景及代碼實現

好比咱們現正在寫掘金文章。突然個人電腦死機了。直接重啓了,那我這好不容易快寫好的文章怎麼辦,難道還須要重頭再寫嗎。固然不是

我能夠先建立一個 Blog 對象,該對象中包含 掘金ID、title 和 content,分別表明了 Blog 的惟掘金惟一ID、標題和內容;並提供建立備忘錄的 createMemento() 和 restore(BlogMemento m) 方法,分別用於建立備忘錄和經過備忘錄來恢復原始的 Blog 對象。

代碼實現

//博客內容實體
public class Blog {
    private long id;
    private String title;
    private String content;
    public Blog(long id, String title) {
        super();
        this.id = id;
        this.title = title;
    }
    //get set 省略
    
    
    public BlogMemento createMemento() {
        BlogMemento m = new BlogMemento(id, title, content);
        return m;
    }
    public void restore(BlogMemento m) {
        this.id = m.getId();
        this.title = m.getTitle();
        this.content = m.getContent();
    }
    
}
複製代碼

而後,再來建立一個 Blog 的備忘錄對象 BlogMemento,一樣是複製 Blog 所須要的全部屬性內容。

public class BlogMemento {
    private final long id;
    private final String title;
    private final String content;
    public BlogMemento(long id, String title, String content) {
        super();
        this.id = id;
        this.title = title;
        this.content = content;
    }
    public long getId() {
        return id;
    }
    public String getTitle() {
        return title;
    }
    public String getContent() {
        return content;
    }
}
複製代碼

這樣基於 Blog 對象的備忘錄就建立好了。最後,咱們依然仍是運行一段單元測試代碼來看看運行結果。

public class Client {
    public static void main(String[] args) {
        Blog blog = new Blog(1, "java備忘錄模式 | 如何記錄歷史信息");
        blog.setContent("歷史信息的記錄........");      //原始的文章內容
        System.out.println(blog);
        BlogMemento memento = blog.createMemento();   //建立blog的備忘錄
        blog.setContent("修改圖片");      //改變內容
        System.out.println(blog);
        blog.restore(memento);       //撤銷操做
        System.out.println(blog);    //這時會顯示原始的內容
    }
}
複製代碼

你們從代碼中能夠看出:備忘錄模式在頻繁須要撤銷與恢復的場景中可以發揮很好的做用

總結

備忘錄模式也叫快照模式,具體來講,就是經過捕獲對象在某一個時刻的對象狀態,再將其保存到外部對象,以便在須要的時候恢復對象到指定時刻下的狀態。

注意:在使用備忘錄模式時,必定不要誤認爲它就是萬能的備份模式,要合理評估對象所使用的內存空間,再肯定是否使用備忘錄模式。

好了 今天的講述就到這裏,備忘錄模式比較簡單,就很少贅述。

弦外之音

感謝你的閱讀,若是你感受學到了東西,麻煩您點贊,關注。

我已經將本章收錄在專題裏,點擊下方專題,關注專欄,我會天天發表乾貨,本月我會持續輸入設計模式。

加油! 咱們下期再見!

相關文章
相關標籤/搜索