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
复制代码
评论