目录
1.备忘录模式的概念
在不破坏封装性的前提下,获取一个对象的内部状态,并把这个状态保存在对象之外,这样就可以将该对象恢复到原先保存的状态
2.备忘录模式的结构图
3.练习的代码
游戏角色类:
/**
* 备忘录模式
* 游戏角色类
*/
@Data
public class GameRole {
private int vit;
private int atk;
private int def;
/**
* 初始化状态
*/
public void getInitState() {
System.out.println("初始化角色状态!");
vit = 100;
atk = 100;
def = 100;
}
/**
* 输出角色状态
*/
public void display() {
System.out.println("当前角色状态:");
System.out.println("生命:" + getVit());
System.out.println("攻击力:" + getAtk());
System.out.println("防御力:" + getDef());
}
/**
* 战斗过后角色的状态清零
*/
public void fight() {
System.out.println("开始进行战斗!");
vit = 0;
atk = 0;
def = 0;
}
/**
* 创建状态备忘录RoleStateMemento的对象 并将角色类需要备份的属性传入备忘录
*
* @return
*/
public RoleStateMemento saveState() {
System.out.println("开始进行备份!");
return new RoleStateMemento(vit, atk, def);
}
/**
* 将当前对象的状态通过传入的备忘录对象恢复到原来的状态
*
* @param roleStateMemento
*/
public void RecoveryState(RoleStateMemento roleStateMemento) {
System.out.println("开始进行恢复!");
this.vit = roleStateMemento.getVit();
this.atk = roleStateMemento.getAtk();
this.def = roleStateMemento.getDef();
}
}
备忘录类:
/**
* 状态备忘录类
*/
@Data
public class RoleStateMemento {
private int vit;
private int atk;
private int def;
public RoleStateMemento(int vit, int atk, int def) {
this.vit = vit;
this.atk = atk;
this.def = def;
}
}
备忘录管理者类:
/**
* 备忘录管理者
*/
@Data
public class RoleStateCareTaker {
private RoleStateMemento roleStateMemento;
}
测试类:
public class Test {
public static void main(String[] args) {
//大战之前
GameRole gameRole = new GameRole();
gameRole.getInitState(); // 初始化角色的状态
gameRole.display();
//备份的操作
//创建备忘录的管理者
RoleStateCareTaker roleStateCareTaker = new RoleStateCareTaker();
//创建备忘录将状态进行备份的同时,将备忘录交给管理者保管
roleStateCareTaker.setRoleStateMemento(gameRole.saveState());
//开始大战
gameRole.fight();
gameRole.display();
//通过管理者管理的备忘录进行恢复
gameRole.RecoveryState(roleStateCareTaker.getRoleStateMemento());
gameRole.display();
}
}
控制台:
4.练习的代码结构图:
5.总结
何时用:备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,考虑使用。
使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
在当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
缺点:如果状态数据很大很多,那么在资源消耗上,备忘录对象会非常耗内存。