备忘录模式
-
概述:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样可以将对象恢复到原先保存的状态.
-
帮助理解:备忘录模式就是为对象提供一个备份的地方,当对象想要回滚到前一个状态时,调用备忘录对象直接就可以恢复.
-
备忘录模式说包含的角色
-
Originator : 原发器,也就是发起者.记录有当前时刻自身的内部状态,负责创建一个备忘录Memento,用于记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态.Originator可以根据需要决定Memento存储自己的哪些内部状态(发起者可能有很多内部状态,可以决定哪些由备忘录备份)
-
Memento : 备忘录.负责存储Originator对象的内部状态,并可以防止Originator之外的其它对象访问备忘录.备忘录有两个接口.Caretaker只能看到备忘录的窄接口,他只能将备忘录对象传递给其它对象.Originator却能够看到备忘录的宽接口.允许它访问返回到先前状态所需要的所有数据.
-
Caretaker : 管理者.负责保存备忘录.但是不能对备忘录的内容进行操作和访问.只能够将备忘录传递给其它对象.
-
-
优点
-
有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须由发起人对象自己读取.这时使用备忘录模式可以将复杂的发起人内部信息对其它对象屏蔽起来.从而可以恰当的保持封装的边界.
-
备忘录模式简化了发起者类.发起者不再需要管理和保存其内部状态的一个个版本.客户端可以自行管理他们所需要的这些状态的版本.
-
当发起者角色的状态发生改变的时候.有可能这个状态无效,需要回滚到前一个状态.这时候可以使用暂时存储起来的备忘录将状态进行还原.
-
-
缺点
-
如果发起者角色的状态有很多并且需要完整的储存到备忘录对象中.那么备忘录对象会很消耗资源.
-
-
注意事项
-
备忘录模式最理想的情况是只允许生成该备忘录的那个原发器能够访问这个备忘录的内部状态.
-
/**
* 〈备忘录对象类〉
*
* @author vegetate
* @create 2018/11/12 17:08
*/
public class MemoBean {
private int useTime;//使用时间
private String deviceName;//设备名称
private int stateLevel;//状态
public int getUseTime() {
return useTime;
}
public void setUseTime(int useTime) {
this.useTime = useTime;
}
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public int getStateLevel() {
return stateLevel;
}
public void setStateLevel(int stateLevel) {
this.stateLevel = stateLevel;
}
}
/**
* 〈备忘录管理对象〉
*
* @author vegetate
* @create 2018/11/12 17:11
*/
public class MemoManager {
MemoBean memento;
public MemoBean getMemento() {
return memento;
}
public void setMemento(MemoBean memento) {
this.memento = memento;
}
}
/**
* 〈发起者对象〉
*
* @author vegetate
* @create 2018/11/12 17:13
*/
public class MemoRole {
private int useTime;// 使用时间
private String deviceName;// 设备名称
private int stateLevel;// 状态
public MemoRole(String deviceName, int useTime, int stateLevel) {
super();
this.useTime = useTime;
this.deviceName = deviceName;
this.stateLevel = stateLevel;
}
public MemoRole() {
}
public int getUseTime() {
return useTime;
}
public void setUseTime(int useTime) {
this.useTime = useTime;
}
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public int getStateLevel() {
return stateLevel;
}
public void setStateLevel(int stateLevel) {
this.stateLevel = stateLevel;
}
public MemoBean createMemoObject() {
MemoBean memento = new MemoBean();
memento.setDeviceName(deviceName);
memento.setStateLevel(stateLevel);
memento.setUseTime(useTime);
return memento;
}
public void setMemento(MemoBean memento) {
this.deviceName = memento.getDeviceName();
this.stateLevel = memento.getStateLevel();
this.useTime = memento.getUseTime();
}
/**
* 获取对象当前状态
*/
public void getCurrentState() {
System.out.println("当前设备名称:" + this.deviceName + "当前使用时间:" + this.useTime + "当前工作状态:" + this.stateLevel);
}
}
测试类
/**
* 〈测试类〉
*
* @author vegetate
* @create 2018/11/12 17:14
*/
public class Test {
public static void main(String[] args) {
// 新建备忘录发起者对象
MemoRole role = new MemoRole("发电机", 0, 1);
// 新建备忘录管理者
MemoManager manager = new MemoManager();
// 角色初始状态
System.out.println("机器开始发电:");
role.getCurrentState();
// 利用备忘录模式保存当前状态
System.out.println("---保存当前的机器状态---");
manager.setMemento(role.createMemoObject());
role.setDeviceName("发电机");
role.setStateLevel(5);
role.setUseTime(1000);
System.out.println("已经持续发电1000小时");
role.getCurrentState();
// 恢复保存的角色状态
role.setMemento(manager.getMemento());
System.out.println("恢复后发电机当前状态:");
role.getCurrentState();
}
}
结果:
机器开始发电:
当前设备名称:发电机当前使用时间:0 当前工作状态:1
—保存当前的机器状态—
已经持续发电N小时
当前设备名称:发电机当前使用时间:1000 当前工作状态:5
恢复后发电机当前状态:
当前设备名称:发电机当前使用时间:0 当前工作状态1