十九. 备忘录模式
整理自 《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());
}
}
整理自 《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());
}
}