使用场景
/**
* 备忘录模式:
* 在不破坏封装的前提下,捕获一个对象的内存状态,并在这个对象之外保存这个状态.
* 方便之后进行恢复
*
* 作用:
* 当角色的状态改变,有时候需要备份并复原
* 备忘录模式把要细节的细节封装到Memento类中,即使以后要修改实现细节也不会影响客户端
*
* 应用场景:
* 适用于功能比较复杂的,但需要记录或维护属性历史的类.
* 或者需要保存的属性是众多属性的一部分时,originator可以通过memento恢复到某一状态
*/
一般处理方式
public class Role {
public String name;
public int vita=100 ;
public int magic=100 ;
public Role (String name) {
this .name = name;
}
}
//未使用备忘录模式之前保存数据
public void MementoPattern(){
Role role = new Role("勇士" )
//存档,暴露了实现细节
Role backup = new Role("备份" )
backup.magic =role.magic
backup.name =role.name
backup.vita =role.vita
//打boss... 失败
//恢复存档,暴露了实现细节
role.magic =backup.magic
role.name =backup.name
role.vita =backup.vita
}
备忘录模式UML
范例
public class Memento {
private String mState;
public Memento (String state) {
mState = state;
}
public String getState () {
return mState;
}
public void setState (String state) {
mState = state;
}
}
public class CareTaker {
private Memento mMemento;
public Memento getMemento () {
return mMemento;
}
public void setMemento (Memento memento) {
mMemento = memento;
}
}
public class Originator {
private String mState;
public String getState () {
return mState;
}
public void setState (String state) {
mState = state;
}
public Memento createMemento (){
return new Memento(mState);
}
public void setMemento (Memento memento){
mState=memento.getState();
}
}
//客户端
Originator originator = new Originator()
originator.setState ("满血" )
//存档
CareTaker careTaker = new CareTaker()
careTaker.setMemento (originator.createMemento ())
//打boss....失败
originator.setState ("残血" )
Log.d ("meee" ,getClass()+":\n" +"" +originator.getState ())
//恢复存档
originator.setMemento (careTaker.getMemento ())
Log.d ("meee" ,getClass()+":\n" +"" +originator.getState ())