备份应该是完全,不能被修改的,它保证数据的洁净,避免数据污染而使备份失去意义,也就是说需要缩小备份出的备忘录的阅读权限,保证只能是发起人可读就可以了,这时候我们就可以使用内置类
建立一个空的接口IMemento——什么方法属性都没有的接口,然后再发起人Originator类中建立一个内置类,Memento实现IMemento接口,同时实现自己的业务逻辑
发起人角色
public class Originator {
private String state = "";
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
//创建一个备忘录
public IMemento creatMemento(String state){
return new Memento(state);
}
//恢复一个备忘录
public void restoreMemento(IMemento memento){
this.setState(((Memento)memento).getState());
}
//内置类
private class Memento implements IMemento {
private String state = "";
private Memento(String state){
this.state = state;
}
private String getState(){
return state;
}
private void setState(String state) {
this.state = state;
}
}
}
内置类Memento的访问权限全部都是private,除了发起人之外,其他人无法访问到,如果要产生关联关系,则可以利用空接口的公共访问权限
备忘录的空接口
public interface IMemento {
}
备忘录管理者
public class Caretaker {
//备忘录角色
private IMemento memento;
public IMemento getMemento(){
return memento;
}
public void setMemento(IMemento memento){
this.memento = memento;
}
}
这样全部都通过接口访问,也不能访问它的属性,但是安全是相对的,可以通过反射的方法修改相关数据
这里 使用了一种新的设计方法“双接口设计”,一个类可以实现多个接口,在系统设计时,如果要考虑对象的安全问题,我们可以提供两个接口,一个是业务的正常接口,实现业务逻辑,称为宽接口,另外一个称为空接口,什么方法都没有,其目的是提供给子系统外的模块访问,比如容器对象,这个叫做窄接口,因为窄接口中没有提供任何操纵数据的方法,相对来说是比较安全
最佳实践
比如说不要把数据放到数据库的临时表作为缓存备份数据,因为这会增加数据库的压力,所以应该使用备忘录模式