备忘录模式-Memento Pattern

Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态。

本文中的场景: 有一款游戏可以随时存档, 存档完成后就可以读取档案里的数据, 然后下次开机就可以从那个时间点继续玩游戏了.

有一个小孩通过存档的机制发现了一个窍门: 他每玩一会儿游戏, 就看看他在游戏中是挣钱了还是亏本了

如果挣钱了那就赶紧存档; 如果赔钱了, 那就赶紧关机, 从上一个存档重新开始.

这样, 这个小孩就做到了只赚不赔,哈哈哈, 接下来看看这个备忘录模式吧.

Gamer类

这是游戏者类, 是备忘录的被作用对象.

import java.util.*;

/**
* 游戏主人公
*/
public class Gamer {
private static final Random random = new Random(); /**
* 所持游戏金额
*/
private int money; public Gamer(int money) {
this.money = money;
} public int getMoney() { // 获取当前所持金钱
return money;
} public void bet() {
int dice = random.nextInt(3) + 1;
if (dice == 1) {
money += 100;
System.out.println("所持金钱增加了。");
} else if (dice == 2) {
money -= random.nextInt(money - 1) + 1;
System.out.println("所持金钱减少了。");
} else {
System.out.println("什么都没有发生。");
}
} // 创建备忘录, 作为快照
public Memento createMemento() {
return new Memento(money);
} // 使用备忘录来进行恢复数据
public void restoreMemento(Memento memento) {
this.money = memento.getMoney();
} public String toString() {
return "[money = " + money + "]";
}
}

Memento类

备忘录类, 用此类来存Gamer类的备份信息.

/**
* 备忘录,存档, 或者叫快照
*/
public class Memento {
// 存档中的金额
private int money; public int getMoney() {
return money;
} public Memento(int money) {
this.money = money;
}
}

Main

此处用于模拟场景, 运行程序

import Memento.Sample.game.Gamer;
import Memento.Sample.game.Memento; public class Main {
public static void main(String[] args) {
// 最初的所持金钱数为100
Gamer gamer = new Gamer(100); // 保存最初的状态
Memento memento = gamer.createMemento(); for (int i = 0; i < 10; i++) {
// 显示当前是第几次循环
System.out.println("==== " + i); // 显示主人公现在的金钱数
System.out.println("当前状态:" + gamer); // 进行游戏
gamer.bet(); System.out.println("所持金钱为" + gamer.getMoney() + "元。"); // 决定如何处理Memento,
// 如果金币增加, 那么就继续
// 如果金币减少了, 那么就从备忘录中获取
if (gamer.getMoney() > memento.getMoney()) {
System.out.println(" (所持金钱增加了,因此保存游戏当前的状态)");
memento = gamer.createMemento();
} else if (gamer.getMoney() < memento.getMoney()) {
System.out.println(" (所持金钱减少了,因此将游戏恢复至以前的状态)");
gamer.restoreMemento(memento);
System.out.println(" (恢复之后的金钱为:" + gamer.getMoney() + "元)");
} System.out.println("");
}
}
}

运行结果比较长, 取一段典型的部分展示出来:

最新文章

  1. linux基础-基本命令的讲解(1-7单元)
  2. DISP_FUNCTION用法
  3. block的动态传值例子
  4. poj 1979 Red and Black(dfs水题)
  5. Android上的远程调试
  6. 《经久不衰的Spring框架:@ResponseBody 中文乱码》
  7. BZOJ 3997: [TJOI2015]组合数学 [偏序关系 DP]
  8. ubuntu下无法编译ruby-2.1.5提示something wrong with CFLAGS -arch x86_64
  9. [Swift]LeetCode459. 重复的子字符串 | Repeated Substring Pattern
  10. 啊哈算法第四章第三节 层层递进-广度优先搜索 java实现
  11. Python从菜鸟到高手(18):类与方法的私有化
  12. 图解android开发在界面上显示图片
  13. Python- - -函数目录
  14. 【sping揭秘】12、SpringAOP的实现机制
  15. Docker 为 ASP.NET Core Web 应用程序生成 Docker 映像,创建并运行多个容器
  16. 20155325 Exp7 网络欺诈防范
  17. windos或linux中 which命令 查看当前要执行的命令所在的路径
  18. TCP中的三次握手和四次挥手
  19. [ActionScript 3.0] flash中的颜色
  20. 子查询在UPDATE 语句中的应用

热门文章

  1. go的生产者-消费者模式
  2. vue(7)—— 组件化开发 — webpack(1)
  3. 抽象,接口和Object类
  4. oracle异地备份
  5. git简单提交操作
  6. 如何在element-UI 组件的change事件中传递自定义参数
  7. pytorch的函数中的dilation参数的作用
  8. Linux基本操作
  9. selenium跳过webdriver检测并爬取淘宝我已购买的宝贝数据
  10. vue省市区三级联动