白话-23种设计模式13-备忘录模式
【摘要】 一、白话 玩游戏的时候,我们经常会存储进度,或者玩到某个进度的时候,系统自动保存,当我们死亡时,能够直接读取保存的某个状态,让我们重新攻略一次。存储某个时间节点的状态,便于后续恢复,就是备忘录模式。二、定义 在不破坏封装性的前提下,捕获某个状态的内部状态,并在该对象之外保存这个状态。备忘录模式的主要角色如下。发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和...
一、白话
玩游戏的时候,我们经常会存储进度,或者玩到某个进度的时候,系统自动保存,当我们死亡时,能够直接读取保存的某个状态,让我们重新攻略一次。存储某个时间节点的状态,便于后续恢复,就是备忘录模式。
二、定义
在不破坏封装性的前提下,捕获某个状态的内部状态,并在该对象之外保存这个状态。
备忘录模式的主要角色如下。
发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
三、示例
/**
* 备忘录角色-需要存储的内部状态角色,备忘单位
*/
public class Hero {
// 名字
private String name;
// 血量
private int blood;
public Hero(String name, int blood) {
this.name = name;
this.blood = blood;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
}
// 发起者角色-提供创建和恢复备忘录功能,同时记录当前状态
public class Player {
private String name;
private int blood;
// 创建备忘
public Hero creatMemento() {
return new Hero(name, blood);
}
// 恢复至备忘
public void backMemento(Hero hero) {
this.name = hero.getName();
this.blood = hero.getBlood();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
}
/**
* 管理者角色-对备忘录进行管理,提供保存和获取备忘录,但不能操作,只能交给发起人
*/
public class Game {
private Map<String,Hero> mementos = new HashMap<>();
// 读取指定备份
public Hero readMemento(String node) {
if(!mementos.containsKey(node)) {
throw new IllegalArgumentException("备份不存在");
}
return mementos.get(node);
}
// 存储备份
public void saveMemento(String node, Hero hero) {
mementos.put(node, hero);
}
}
public class MementoApplication {
// 客户端调用
public static void main(String[] args) {
// 模拟玩游戏-新建一个发起人,即当前游戏状态
Player player = new Player();
// 当前游戏角色状态 李白 90滴血
player.setName("李白");
player.setBlood(90);
// 发起人保存状态,管理者进行管理
Game game = new Game();
game.saveMemento("第一关", player.creatMemento());
System.out.println("第一关存储完成,角色:" +player.getName()+ ",血量:" + player.getBlood());
// 第二关 角色以及状态
player.setName("王昭君");
player.setBlood(100);
game.saveMemento("第二关", player.creatMemento());
System.out.println("第二关存储完成,角色:" +player.getName()+ ",血量:" + player.getBlood());
// 第三关 想重玩第一关 第三关当前角色 蔡文姬 80
player.setName("蔡文姬");
player.setBlood(80);
// 读取第一关节点
System.out.println("第一关读取中,读取前角色:" +player.getName()+ ",血量:" + player.getBlood());
player.backMemento(game.readMemento("第一关"));
System.out.println("第一关读取完成,当前角色:" + player.getName()+ ",血量:" + player.getBlood());
}
}
结果输出:
第一关存储完成,角色:李白,血量:90
第二关存储完成,角色:王昭君,血量:100
第一关读取中,读取前角色:蔡文姬,血量:80
第一关读取完成,当前角色:李白,血量:90
四、总结
特点:提供状态恢复,可以撤销。如果保存的对象数据越大,需要保存的节点越多,则资源消耗就越大。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)