備忘錄模式(Memento),其含義是在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就可將該對象恢復到原先保存的狀態。
有時候咱們有必要記錄一個對象的內部狀態,可讓用戶取消不肯定的操做或從錯誤中恢復過來,可是又不能破壞封裝性。咱們可用備忘錄模式,一個備忘錄是一個對象,它存儲另外一個對象在某個瞬間的內部狀態,然後者稱爲備忘錄的原發器。當須要設置原發器的檢查點時,取消操做機制會向原發器請求一個備忘錄。原發器用描述當前狀態的信息初始化該備忘錄,只有原發器能夠向備忘錄存取信息,備忘錄對其餘對象不可見。測試
其適用性:this
必須保存一個對象在某一個時刻的(部分) 狀態,這樣之後須要時它才能恢復到先前的狀態,spa
若是一個用接口來讓其餘對象直接獲得這些狀態,將會暴露對象的實現細節並破壞對象的封裝性。code
其結構圖:對象
Memento來負責備忘錄存儲原發器對象的內部狀態,其實際上有兩個接口,管理者只能看到備忘錄的窄接口,它只能將備忘錄傳遞給其餘對象。相反,原發器可以看到一個寬接口,容許它訪問返回到先前狀態所需的全部數據。Originator負責建立備忘錄,Caretaker負責保存備忘錄。實現以下:blog
package org.designpattern.behavioral.memento;接口
public
class
Memento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState() {
return state;
}
}
原發器建立備忘錄,對它的狀態進行賦值:get
package org.designpattern.behavioral.memento;it
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 setStateFromMemento(Memento memento){
this.state = memento.getState();
}
} io
管理器向原發器請求一個備忘錄,並保存下來,須要時送回原發器:
package org.designpattern.behavioral.memento;
public
class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public
void setMemento(Memento memento) {
this.memento = memento;
}
}
下面是客戶段測試類:
package org.designpattern.behavioral.memento;
public
class Main {
public
static
void main(String[] args) {
Originator originator =
new Originator();
originator.setState("loving");
Memento memento = originator.createMemento();
System.out.println(originator.getState());
Caretaker caretaker =
new Caretaker();
caretaker.setMemento(memento);
originator.setState("divorce");
System.out.println(originator.getState());
originator.setStateFromMemento(caretaker.getMemento());
System.out.println(originator.getState());
}
}
該模式把可能複雜的Originator內部信息對其餘對象屏蔽起來,若是原發器在生成備忘錄時必須拷貝並存儲大量的信息或者其餘狀況,有可能會致使很是大的開銷。由於該模式的接口較小,以致於備忘錄只能做爲一個值傳遞。其經常使用來與Command模式一塊兒用來維護能夠撤銷的操做。