定义:
在不破坏封闭的前提下,捕获一个对象的内部状态,并在改对象之外保存这个状态,以后可以将对象恢复到原先保存的状态。
应用场景:
适用于功能比较复杂,但余姚维护or记录属性历史的功能。
涉及角色:
Originator(发起者):负责创建一个备忘录Memo,用来记录当前时刻自身的内部状态,并可以恢复备忘录内部状态,
可以根据需要决定memo存储自己的那些内部状态。
Memo(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录, 备忘录有两个接口:Caretaker只能开到备忘录的小接口,他只能将备忘录传递给其他对象。Originator却可以看到备忘录的大接口,允许它访问返回到先前状态所需的所有数据。
Caretaker(管理者):负责管理备忘录memo,不能对memo的内容进行访问or操作。
Originate(备忘录发起者与恢复者):
package com.roc.meomory;
/**
* 游戏角色
* @author liaowp
*
*/
public class GameRole {
private int vit;
private int atk;
public void init(){
vit=100;
atk=100;
}
public void show(){
System.out.println("体力:"+vit);
System.out.println("攻击力:"+atk);
}
public void fightBoss(){
this.vit=0;
this.atk=0;
}
public RoleStateMemento saveMemento(){
return (new RoleStateMemento(vit, atk));
}
public void recove(RoleStateMemento roleStateMemento){
this.vit=roleStateMemento.getVit();
this.atk=roleStateMemento.getAtk();
}
}
Caretaker(管理者):管理备忘录,不能对备忘录的内容进行访问or操作。
package com.roc.meomory;
/**
* 游戏角色管理类
* @author liaowp
*
*/
public class RoleStateMange {
private RoleStateMemento memento;
public RoleStateMemento getMemento() {
return memento;
}
public void setMemento(RoleStateMemento memento) {
this.memento = memento;
}
}
Memo(备忘录):
package com.roc.meomory;
/**
* 存储类
* @author liaowp
*
*/
public class RoleStateMemento {
private int vit;
private int atk;
public RoleStateMemento(int vit, int atk){
this.vit=vit;
this.atk=atk;
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
}
测试类:
package com.roc.meomory;
/**
* 备忘录模式
* @author liaowp
*
*/
public class Client {
public static void main(String[] args) {
GameRole liaowp=new GameRole();
liaowp.init();
liaowp.show();
RoleStateMange adminMange=new RoleStateMange();
adminMange.setMemento(liaowp.saveMemento());//保存
liaowp.fightBoss();
liaowp.show();
liaowp.recove(adminMange.getMemento());
liaowp.show();
}
}