备忘录模式

十九. 备忘录模式
整理自 《java与模式》阎宏编著


1.意图:

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。

2.类图:

[img]http://eneasy.iteye.com/upload/picture/pic/10099/237bc759-a1c7-3701-be9f-13f75830f357.jpg[/img]

3.原理:

4.特征:

备忘录(Memento)角色:

备忘录(Memento)角色的职责:

1.将发起人(Originator)对象的内部状态存储起来。

2.保护其内容不被发起人(Originator)对象之外的任何对象所读取。提供了两个等效的接口:
窄接口:负责人(Caretaker)对象(和其他除发起人对象之外的任何对象)看到的是备忘录的窄接口(narrow interface),这个窄接口只允许它把备忘录对象传给其他的对象。
宽接口:发起人(Originator)对象可以看到一个宽接口(wide interface),这个宽接口允许它读取所有的数据,以便根据这些数据恢复发起人对象的内部状态。

发起人(Originator)角色:

发起人(Originator)的职责:
1.创建一个含有当前的内部状态的备忘录对象。

2使用备忘录对象存储其内部状态。

负责人(Caretaker)角色:

负责人(Caretaker)角色的职责:

1.负责保存备忘录对象。

2.不查看或修改备忘录对象的内容。


5.说明:

备忘录经常和迭代模式和命令模式一起使用。

本例是“白箱”实现,对于“黑箱”实现及“java实现双重接口”参见《java与模式》。

6.使用案例:

7.代码:

// Originator.java

public class Originator

{

private String state;



/**

* 工厂方法,返回一个新的备忘录对象

* @return

*/

public Memento createMemento()

{

return new ConcreteMemento(state);

}

/**

* 将发起人恢复到备忘录对象所记载的状态

* @param memento

*/

public void setMemento(Memento memento)

{

this.state = memento.getState();

}

}



// Memento.java

/**

* 备忘录将发起人对象的状态保存起来。

*/

public class Memento

{

private String state;



Memento(String state)

{

this.state = state;

}



public String getState()

{

return state;

}



public void setState(String state)

{

this.state = state;

}

}



// Caretaker.java

/**

* 负责人负责保存备忘录对象,但不修改(甚至查看)备忘录对象的内容

* @author xmlin

*

*/

public class Caretaker

{

private Memento memento;



/**

* 备忘录的取值方法

* @return

*/

public Memento retrieveMemento()

{

return this.memento;

}



/**

* 备忘录的赋值方法

* @return

*/

public void saveMemento(Memento memento)

{

this.memento = memento;

}

}



public class Client

{

private static Originator o = new Originator();

private static Caretaker c = new Caretaker();

public static void main(String [] args)

{

//改变负责人的对象的状态

o.setState(“on”);

//创建备忘录对象,并将发起人对象的状态存储起来

c.saveMemento(o.createMemento());

//修改发起人对象的状态

o.setState(“Off”);

//恢复发起人对象的状态

o.restoreMemento(c.retrieveMemento());
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值