這是我參與8月更文挑戰的第10天,活動詳情查看:8月更文挑戰java
歡迎來到今天的學習,今天咱們一塊兒來學習下不怎麼經常使用的一種模式-----備忘錄模式。多嘮叨幾句,我本月將會對java的設計模式精講,歡迎點擊頭像,關注個人專欄,我會持續更新,加油!程序員
系列文章:數據庫
設計模式之單例模式設計模式
設計模式之工廠模式markdown
設計模式之建造者模式post
設計模式之代理模式單元測試
設計模式之命令者模式this
...持續更新中
話很少說,進入正題
相比較其餘幾種模式而言,備忘錄模式不怎麼經常使用。該模式我認爲用起來你感受簡單,理解起來也沒有那麼抽象,因此本節應該是比較簡單的一節。
官方定義是:捕獲並外部化對象的內部狀態,以便之後能夠恢復。
能夠理解成copy,複製出一套東西,咱們程序員最經常使用的可能就是數據庫的備份等。這個備忘錄雖然表面字眼稱之爲備忘錄,可是更多的就是理解爲「備份模式」。
咱們看下簡單的類圖
從該圖中,咱們能看出備忘錄模式包含兩個關鍵角色。
原始對象(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); //這時會顯示原始的內容
}
}
複製代碼
你們從代碼中能夠看出:備忘錄模式在頻繁須要撤銷與恢復的場景中可以發揮很好的做用
備忘錄模式也叫快照模式,具體來講,就是經過捕獲對象在某一個時刻的對象狀態,再將其保存到外部對象,以便在須要的時候恢復對象到指定時刻下的狀態。
注意:在使用備忘錄模式時,必定不要誤認爲它就是萬能的備份模式,要合理評估對象所使用的內存空間,再肯定是否使用備忘錄模式。
好了 今天的講述就到這裏,備忘錄模式比較簡單,就很少贅述。
感謝你的閱讀,若是你感受學到了東西,麻煩您點贊,關注。
我已經將本章收錄在專題裏,點擊下方專題,關注專欄,我會天天發表乾貨,本月我會持續輸入設計模式。
加油! 咱們下期再見!