备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
这样以后就可将该对象恢复到原先保存的状态。
优点:
1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,
这时使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理
他们所需要的这些状态的版本。
3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
缺点:
1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
2、当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,
从而无法提醒用户一个操作是否很昂贵。
3、当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,
不如采取“假如”协议模式。
/**
* 备忘录:负责存储Originator对象的内部状态,并可防止Originator以外的其它对象访问备忘录
*
*/
public class Memento {
// 需要保存的数据属性,可以是多个
private String state;
public Memento(String state){
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
/**
* 管理者类:负责备忘录Memento,不能对Memento的内容进行访问或者操作。
*
*/
public class Caretaker {
// 得到或设置备忘录
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
/**
* 发起人(Originator):负责创建一个备忘录(Memento),用以记录当前时刻它的内部状态,
* 并可使用备忘录恢复内部状态。发起人可根据需要决定备忘录存储发起人的哪些内部状态。
*
*/
public class Originator {
// 需要保存的属性,可能有多个
private String state;
// 创建备忘录,将当前需要保存的信息导入,并实例化出一个Memento对象
public Memento createMemento(){
return (new Memento(state));
}
// 恢复备忘录,将Memento导入并恢复相关数据
public void setMemento(Memento memento){
this.state = memento.getState();
}
// 显示数据
public void show(){
System.out.println("state="+state);
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
public class Main {
public static void main(String[] args) {
// 发起人初始状态设为on
Originator o =new Originator();
o.setState("on");
o.show();
// 管理者设置备忘录(保存发起人的状态)
Caretaker c = new Caretaker();
c.setMemento(o.createMemento());
// 发起人状态改变
o.setState("off");
o.show();
// 发起人恢复状态(管理者保存的状态,从管理者处获得备忘录)
o.setMemento(c.getMemento());
o.show();
}
}
输出结果如下:
state=on
state=off
state=on