Sunny 软件公司正在开发一款 RPG 网游。为了给玩家提供更多方便,在游戏过程中可以设置一个恢复点,用于保存当前的游戏场景。如果在后续游戏过程中玩家角色“不幸牺牲”,可以返回到先前保存的场景,从所设恢复点开始重新游戏。试使用备忘录模式设计该功能。
一、类结构图
原发器类:设计为名称为 PlayScene 的具体类,面向具体备忘录类编程,包含具体方法 setName(String name)、具体方法 setLevel(Integer level)、具体方法 save()、具体方法 restore(SceneMemento sceneMemento)、具体方法 display();
备忘录类:设计为名称为 SceneMemento 的具体类,包含具体方法 setName(String name)、具体方法 setLevel(Integer level);
负责人类:设计为名称为 MementoCaretaker 的具体类,持久一个具体备忘录类的引用,包含具体方法 setMemento(SceneMemento sceneMemento)、具体方法 getMemento()。
二、典型实现代码
具体场景类:具体原发器类
// 具体场景类:具体原发器类
public class Scene {
private String name;
private Integer level;
public Scene(String name, Integer level) {
this.name = name;
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public void display() {
System.out.println("位置为:" + this.name + ", 等级为:" + this.level);
}
public SceneMemento save() {
return new SceneMemento(this.name, this.level);
}
public void restore(SceneMemento sceneMemento) {
this.name = sceneMemento.getName();
this.level = sceneMemento.getLevel();
}
}
复制代码
具体场景备忘录类:具体备忘录类
// 具体场景备忘录类:具体备忘录类
public class SceneMemento {
private String name;
private Integer level;
public SceneMemento(String name, Integer level) {
this.name = name;
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
}
复制代码
具体场景备忘录负责人类:具体负责人类
// 具体场景备忘录负责人类:具体负责人类
public class MementoCaretaker {
private SceneMemento memento;
public SceneMemento getMemento() {
return memento;
}
public void setMemento(SceneMemento memento) {
this.memento = memento;
}
}
复制代码
客户端代码:
public class Client {
public static void main(String[] args) {
Scene scene;
MementoCaretaker mementoCaretaker;
scene = new Scene("场景一", 5);
mementoCaretaker = new MementoCaretaker();
scene.display();
mementoCaretaker.setMemento(scene.save());
scene.setName("场景二");
scene.setLevel(6);
scene.display();
scene.restore(mementoCaretaker.getMemento());
scene.display();
}
}
复制代码
编译并运行程序,输出如下结果:
位置为:场景一, 等级为:5
位置为:场景二, 等级为:6
位置为:场景一, 等级为:5
复制代码
评论