備忘錄( Memento)模式: 在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。

適用性:

  • 必須保存一個對象在某一個時刻的(部分)狀態(tài), 這樣以后需要時它才能恢復(fù)到先前的狀態(tài)。
  • 如果一個用接口來讓其它對象直接得到這些狀態(tài),將會暴露對象的實(shí)現(xiàn)細(xì)節(jié)并破壞對象的封裝性。


memento.bmp

所涉及的角色:

備忘錄角色:將發(fā)起人 (Originator) 的對象內(nèi)部狀態(tài)存儲起來,備忘錄可以根據(jù)發(fā)起人對象的的判斷來決定存儲多少發(fā)起人( Originator )對象的內(nèi)部狀態(tài)。奮忘錄同時可以保護(hù)其內(nèi)容不被發(fā)起人 (Originator) 對象之外的任何對象所索。

?

發(fā)起人 (Originator) 角色:創(chuàng)建一個含有當(dāng)前的內(nèi)部狀態(tài)的的備忘錄對象 , 使用備忘錄對象存儲內(nèi)部狀態(tài)。

?

負(fù)責(zé)人( Caretaker )角色:負(fù)責(zé)保存?zhèn)渫泴ο螅粰z查備忘錄對象的內(nèi)容。


一個簡單的例子:
備忘錄角色

package ?Memento;

public ? class ?Memento {
????
private ?String?state;
????
// 構(gòu)造方法
???? public ?Memento(String?state) {
????????
this .state = state;
????}

????
// 狀態(tài)的賦值方法
???? public ? void ?setState(String?state) {
????????
this .state = state;
????}

????
// 狀態(tài)的取值方法
???? public ?String?getState() {
????????
return ? this .state;
????}

}
發(fā)起人 (Originator) 角色:
package?Memento;

public?class?Originator{
????
private?String?state;
????
//工廠方法,返回一個新的備忘錄對象
????public?Memento?createMemento(){
????????
return?new?Memento(state);
????}

????
//將發(fā)起人的狀態(tài)恢復(fù)到備忘錄對象所保存的狀態(tài)
????public?void?restoreMemento(Memento?memento){
????????
this.state=memento.getState();
????}

????
//狀態(tài)的賦值方法
????public?void?setState(String?state){
????????
this.state=state;
????????System.out.println(
"Current?State:"+state);
????}

????
//狀態(tài)取值方法
????public??String?getState(){
????????
return?this.state;
????}

}
負(fù)責(zé)人( Caretaker )角色:
package?Memento;

public?class?Caretaker{
????
private?Memento?memento;
????
//備忘錄的取值方法
????public?Memento?retriveMemento(){
????????
return?this.memento;
????}

????
//備忘錄的賦值方法
????public?void?saveMemento(Memento?memento){
????????
this.memento=memento;
????}


}

客戶端:
package?Memento;

public?class?Client{
????
private?static?Originator?o=new?Originator();
????
private?static?Caretaker?c=new?Caretaker();
????
public?static?void?main(String[]?args){
????????
//改變發(fā)起人對象的狀態(tài)
????????o.setState("ON");
????????
//創(chuàng)建備忘錄對象?并將發(fā)起人對象狀態(tài)保存起來
????????c.saveMemento(o.createMemento());
????????
//修改發(fā)起人的對象狀態(tài)
????????o.setState("OFF");
????????
//恢復(fù)發(fā)起人對象的狀態(tài)
????????o.restoreMemento(c.retriveMemento());
????????
//輸出當(dāng)前發(fā)起人對象的狀態(tài)
????????System.out.println(o.getState());
????????
????}

}


參考資料:《java與模式》
《設(shè)計(jì)模式速查找手冊》