兄弟們好,今天來和你們聊聊備忘錄設計模式。java
它的主要思想是:保存一個對象在某一時刻的副本,而且該對象的副本在外部不能夠被訪問,同時該對象的副本能夠被內部從新加載和修改mysql
看到這裏,有沒有想到咱們的序列化。在學習IO
流的時候咱們能夠經過Serializable
實現對象的序列化,這個序列化的過程就是一個備忘錄的過程,經過對當前對象序列化,包含當前的狀態,當須要的時候再將這個狀態加載進來。sql
咱們經常見過的遊戲存檔就是這個實現原理,將全部涉及到對象所有序列化,包含再本地文件中,而後讀檔的時候再加載進去。設計模式
咱們來看一下它類圖實現:安全
它主要有三個角色:學習
Originator
用來描述一個須要被進行備忘錄的對象,它能夠主動的建立一個備忘錄,而且設置其狀態Memento
備忘錄對象,用來保存Originator
對象的狀態,提供兩個接口用於讀取和設置對象的狀態Caretake
。執行具體的備忘錄調用。對於它而言備忘錄僅僅能夠查看,但不能修改咱們來看一下具體的代碼實現:this
備忘錄接口,一個標識設計
interface Memento{ }
須要記錄的對象,寬接口,能夠訪問備忘錄的全部信息rest
class Originator{ private String state ; public Memento createMemento(){ return new InnerMemento(state); } public void restoreState(Memento memento){ this.state = ((InnerMemento)memento).getState(); } public void setState(String state) { this.state = state; } class InnerMemento implements Memento{ private String state ; public InnerMemento(String state){ this.state = state ; } public void setState(String state) { this.state = state; } public String getState() { return state; } } }
具體負責調用,窄接口,僅僅能夠查看備忘錄code
class Caretaker{ private Originator originator ; public Caretaker(Originator originator){ this.originator = originator ; } public Memento createMemento(){ return originator.createMemento(); } public void restoreState(Memento memento){ originator.restoreState(memento); } }
具體調用
public static void main(String[] args) { Originator originator = new Originator(); Caretaker caretaker = new Caretaker(originator); //保存當前狀態 Memento memento = caretaker.createMemento(); originator.setState("個人"); caretaker.createMemento(); }
有沒有發現,這個設計模式強調了一個安全訪問的原則,經過對不一樣的接口實現了一個寬接口和窄接口,來實現不一樣層次的調用。這個模式經常會和命令設計模式聯合起來,用來記錄undo
操做,例如mysql
持久化。
好啦,今天的設計模式就到這裏了,兄弟們,晚安。