抽絲剝繭——備忘錄設計模式
備忘錄設計模式
兄弟們好,今天來和大家聊聊備忘錄設計模式。
它的主要思想是:保存一個對象在某一時刻的副本,並且該對象的副本在外部不可以被訪問,同時該對象的副本可以被內部重新載入和修改
看到這裡,有沒有想到我們的序列化。在學習IO
流的時候我們可以通過Serializable
實現對象的序列化,這個序列化的過程就是一個備忘錄的過程,通過對當前對象序列化,包含當前的狀態,當需要的時候再將這個狀態載入進來。
我們常常見過的遊戲存檔就是這個實現原理,將所有涉及到對象全部序列化,包含再本地文件中,然後讀檔的時候再載入進去。
我們來看一下它類圖實現:
它主要有三個角色:
Originator
用來描述一個需要被進行備忘錄的對象,它可以主動的創建一個備忘錄,並且設置其狀態Memento
備忘錄對象,用來保存Originator
對象的狀態,提供兩個介面用於讀取和設置對象的狀態Caretake
。執行具體的備忘錄調用。對於它而言備忘錄僅僅可以查看,但不能修改
我們來看一下具體的程式碼實現:
備忘錄介面,一個標識
interface Memento{
}
需要記錄的對象,寬介面,可以訪問備忘錄的所有資訊
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;
}
}
}
具體負責調用,窄介面,僅僅可以查看備忘錄
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
持久化。
好啦,今天的設計模式就到這裡了,兄弟們,晚安。