北风设计模式课程---备忘录(Memento)模式

一、总结

一句话总结:

备忘录模式也是一种比较常用的模式用来保存对象的部分用于恢复的信息,和原型模式有着本质的区别,广泛运用在快照功能之中。同样的使用备忘录模式可以使得程序可以组件化,比如打算多次撤销当前的状态,以及不仅可以撤销而且可以将当前的状态保存到文件之中的时候,我们不需要修改Gamer的代码就能做到,职责明确是一种非常重要的是软件工程思想。

1、备忘录模式和原型模式的共同点?

都是保存一个对象在某一个时刻的状态

2、备忘录模式和原型模式的区别?

创建模式 >< 行为模式:备忘录模式是行为模式
多份对象 >< 一份对象:原型模式是多份对象,而备忘录模式只是操作一个实例

原型模式保存的是当前对象的所有状态信息,恢复的时候会生成与保存的对象完全相同的另外一个实例;
而备忘录模式保存的是我们关心的在恢复时需要的对象的部分状态信息,相当于快照。

3、职责明确这一思想在设计模式中有哪些体现?

比如备忘录模式的管理者角色

4、备忘录模式中 原生者角色 最核心的两个方法是什么?

创建备份方法和恢复备份方法
  1. public Memento createMemento(){
  2. Memento m=new Memento(menoy);
  3. Iterator it=fruits.iterator();
  4. while(it.hasNext()){
  5. String fruit=(String)it.next();
  6. if(fruit.startsWith("好吃的")){
  7. m.addFruits(fruit);
  8. }
  9. }
  10. return m;
  11. }
  12.  
  13. public void restoreMemento(Memento memento){
  14. this.menoy=memento.getMenoy();
  15. this.fruits=memento.getFruits();
  16. }

二、设计模式:备忘录(Memento)模式

转自或参考:设计模式:备忘录(Memento)模式
https://www.cnblogs.com/zyrblog/p/9249660.html

一、前言

  备忘录模式用于保存和恢复对象的状态,相信大家看过我前面的拙作就会想到原型模式也能保存一个对象在某一个时刻的状态,那么两者有何不同的呢?原型模式保存的是当前对象的所有状态信息,恢复的时候会生成与保存的对象完全相同的另外一个实例;而备忘录模式保存的是我们关心的在恢复时需要的对象的部分状态信息,相当于快照。备忘录模式大家肯定都见过,比如在玩游戏的时候有一个保存当前闯关的状态的功能,会对当前用户所处的状态进行保存,当用户闯关失败或者需要从快照的地方开始的时候,就能读取当时保存的状态完整地恢复到当时的环境,这一点和VMware上面的快照功能很类似。

二、代码

  Memento类:

  1. package zyr.dp.memento;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class Memento {
  7.  
  8. private int menoy;
  9. private ArrayList fruits;
  10.  
  11. //窄接口,访问部分信息
  12. public int getMenoy(){
  13. return menoy;
  14. }
  15.  
  16. //宽接口,本包之内皆可访问
  17. Memento(int menoy){
  18. this.menoy=menoy;
  19. fruits=new ArrayList();//每次调用的时候重新生成,很重要
  20. }
  21. //宽接口,本包之内皆可访问
  22. List getFruits(){
  23. return (List) fruits.clone();
  24. }
  25. //宽接口,本包之内皆可访问
  26. void addFruits(String fruit){
  27. fruits.add(fruit);
  28. }
  29.  
  30. }
  1. Gamer 类:
  1. package zyr.dp.memento;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Random;
  7.  
  8. public class Gamer {
  9.  
  10. private static String[] FruitsSame={"香蕉","苹果","橘子","柚子"};
  11.  
  12. private int menoy;
  13. private List fruits=new ArrayList();
  14. private Random random=new Random();
  15.  
  16. public int getMenoy(){
  17. return menoy;
  18. }
  19.  
  20. public Gamer(int menoy){
  21. this.menoy=menoy;
  22. }
  23.  
  24. public void bet(){
  25. int next=random.nextInt(6)+1;
  26. if(next==1){
  27. menoy+=100;
  28. System.out.println("金钱增加了100,当前金钱为:"+menoy);
  29. }else if(next==2){
  30. menoy/=2;
  31. System.out.println("金钱减少了一半,当前金钱为:"+menoy);
  32. }else if(next==6){
  33. String f=getFruit();
  34. fruits.add(f);
  35. System.out.println("获得了水果:"+f+",当前金钱为:"+menoy);
  36. }else {
  37. System.out.println("金钱没有发生改变,当前金钱为:"+menoy);
  38. }
  39. }
  40.  
  41. private String getFruit() {
  42.  
  43. String prefix="";
  44. if(random.nextBoolean()){
  45. prefix="好吃的";
  46. }
  47. return prefix+FruitsSame[random.nextInt(FruitsSame.length)];
  48.  
  49. }
  50.  
  51. public Memento createMemento(){
  52. Memento m=new Memento(menoy);
  53. Iterator it=fruits.iterator();
  54. while(it.hasNext()){
  55. String fruit=(String)it.next();
  56. if(fruit.startsWith("好吃的")){
  57. m.addFruits(fruit);
  58. }
  59. }
  60. return m;
  61. }
  62.  
  63. public void restoreMemento(Memento memento){
  64. this.menoy=memento.getMenoy();
  65. this.fruits=memento.getFruits();
  66. }
  67.  
  68. public String toString(){
  69. return "Menoy:"+menoy+" ,Fruits:"+fruits;
  70. }
  71.  
  72. }

 Main类:

  1. package zyr.dp.test;
  2.  
  3. import zyr.dp.memento.Gamer;
  4. import zyr.dp.memento.Memento;
  5.  
  6. public class Main {
  7.  
  8. public static void main(String[] args) {
  9. Gamer gamer=new Gamer(100);
  10. Memento memento=gamer.createMemento();
  11. for(int i=0;i<100;i++){
  12. System.out.println("当前状态:"+i);
  13. System.out.println("当前金额:"+gamer.getMenoy());
  14. gamer.bet();
  15. if(gamer.getMenoy()<memento.getMenoy()/2){
  16. System.out.println("金钱过少,恢复到以前的状态:");
  17. gamer.restoreMemento(memento);
  18. System.out.println("此时状态为:"+gamer);
  19. }else if(gamer.getMenoy()>memento.getMenoy()){
  20. System.out.println("金钱增多,保存当前状态:");
  21. memento=gamer.createMemento();
  22. System.out.println("此时状态为:"+gamer);
  23. }
  24. try {
  25. Thread.sleep(500);
  26. } catch (InterruptedException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30.  
  31. }
  32.  
  33. }

 运行结果:

  1. 当前状态:0
  2. 当前金额:100
  3. 金钱没有发生改变,当前金钱为:100
  4. 当前状态:1
  5. 当前金额:100
  6. 金钱增加了100,当前金钱为:200
  7. 金钱增多,保存当前状态:
  8. 此时状态为:Menoy200 ,Fruits:[]
  9. 当前状态:2
  10. 当前金额:200
  11. 金钱增加了100,当前金钱为:300
  12. 金钱增多,保存当前状态:
  13. 此时状态为:Menoy300 ,Fruits:[]
  14. 当前状态:3
  15. 当前金额:300
  16. 金钱减少了一半,当前金钱为:150
  17. 当前状态:4
  18. 当前金额:150
  19. 金钱减少了一半,当前金钱为:75
  20. 金钱过少,恢复到以前的状态:
  21. 此时状态为:Menoy300 ,Fruits:[]
  22. 当前状态:5
  23. 当前金额:300
  24. 金钱没有发生改变,当前金钱为:300
  25. 当前状态:6
  26. 当前金额:300
  27. 金钱增加了100,当前金钱为:400
  28. 金钱增多,保存当前状态:
  29. 此时状态为:Menoy400 ,Fruits:[]
  30. 当前状态:7
  31. 当前金额:400
  32. 金钱没有发生改变,当前金钱为:400
  33. 当前状态:8
  34. 当前金额:400
  35. 金钱减少了一半,当前金钱为:200
  36. 当前状态:9
  37. 当前金额:200
  38. 金钱增加了100,当前金钱为:300
  39. 当前状态:10
  40. 当前金额:300
  41. 金钱没有发生改变,当前金钱为:300
  42. 当前状态:11
  43. 当前金额:300
  44. 金钱没有发生改变,当前金钱为:300
  45. 当前状态:12
  46. 当前金额:300
  47. 金钱没有发生改变,当前金钱为:300
  48. 当前状态:13
  49. 当前金额:300
  50. 金钱没有发生改变,当前金钱为:300
  51. 当前状态:14
  52. 当前金额:300
  53. 金钱没有发生改变,当前金钱为:300
  54. 当前状态:15
  55. 当前金额:300
  56. 金钱增加了100,当前金钱为:400
  57. 当前状态:16
  58. 当前金额:400
  59. 金钱没有发生改变,当前金钱为:400
  60. 当前状态:17
  61. 当前金额:400
  62. 金钱没有发生改变,当前金钱为:400
  63. 当前状态:18
  64. 当前金额:400
  65. 金钱没有发生改变,当前金钱为:400
  66. 当前状态:19
  67. 当前金额:400
  68. 金钱没有发生改变,当前金钱为:400
  69. 当前状态:20
  70. 当前金额:400
  71. 金钱没有发生改变,当前金钱为:400
  72. 当前状态:21
  73. 当前金额:400
  74. 金钱减少了一半,当前金钱为:200
  75. 当前状态:22
  76. 当前金额:200
  77. 金钱没有发生改变,当前金钱为:200
  78. 当前状态:23
  79. 当前金额:200
  80. 获得了水果:橘子,当前金钱为:200
  81. 当前状态:24
  82. 当前金额:200
  83. 金钱增加了100,当前金钱为:300
  84. 当前状态:25
  85. 当前金额:300
  86. 金钱没有发生改变,当前金钱为:300
  87. 当前状态:26
  88. 当前金额:300
  89. 金钱没有发生改变,当前金钱为:300
  90. 当前状态:27
  91. 当前金额:300
  92. 金钱没有发生改变,当前金钱为:300
  93. 当前状态:28
  94. 当前金额:300
  95. 金钱没有发生改变,当前金钱为:300
  96. 当前状态:29
  97. 当前金额:300
  98. 金钱没有发生改变,当前金钱为:300
  99. 当前状态:30
  100. 当前金额:300
  101. 金钱没有发生改变,当前金钱为:300
  102. 当前状态:31
  103. 当前金额:300
  104. 金钱没有发生改变,当前金钱为:300
  105. 当前状态:32
  106. 当前金额:300
  107. 金钱没有发生改变,当前金钱为:300
  108. 当前状态:33
  109. 当前金额:300
  110. 金钱没有发生改变,当前金钱为:300
  111. 当前状态:34
  112. 当前金额:300
  113. 获得了水果:橘子,当前金钱为:300
  114. 当前状态:35
  115. 当前金额:300
  116. 金钱没有发生改变,当前金钱为:300
  117. 当前状态:36
  118. 当前金额:300
  119. 金钱没有发生改变,当前金钱为:300
  120. 当前状态:37
  121. 当前金额:300
  122. 金钱没有发生改变,当前金钱为:300
  123. 当前状态:38
  124. 当前金额:300
  125. 金钱没有发生改变,当前金钱为:300
  126. 当前状态:39
  127. 当前金额:300
  128. 金钱没有发生改变,当前金钱为:300
  129. 当前状态:40
  130. 当前金额:300
  131. 金钱减少了一半,当前金钱为:150
  132. 金钱过少,恢复到以前的状态:
  133. 此时状态为:Menoy400 ,Fruits:[]
  134. 当前状态:41
  135. 当前金额:400
  136. 金钱减少了一半,当前金钱为:200
  137. 当前状态:42
  138. 当前金额:200
  139. 金钱没有发生改变,当前金钱为:200
  140. 当前状态:43
  141. 当前金额:200
  142. 金钱没有发生改变,当前金钱为:200
  143. 当前状态:44
  144. 当前金额:200
  145. 金钱没有发生改变,当前金钱为:200
  146. 当前状态:45
  147. 当前金额:200
  148. 金钱减少了一半,当前金钱为:100
  149. 金钱过少,恢复到以前的状态:
  150. 此时状态为:Menoy400 ,Fruits:[]
  151. 当前状态:46
  152. 当前金额:400
  153. 金钱没有发生改变,当前金钱为:400
  154. 当前状态:47
  155. 当前金额:400
  156. 金钱没有发生改变,当前金钱为:400
  157. 当前状态:48
  158. 当前金额:400
  159. 金钱没有发生改变,当前金钱为:400
  160. 当前状态:49
  161. 当前金额:400
  162. 获得了水果:香蕉,当前金钱为:400
  163. 当前状态:50
  164. 当前金额:400
  165. 金钱没有发生改变,当前金钱为:400
  166. 当前状态:51
  167. 当前金额:400
  168. 金钱减少了一半,当前金钱为:200
  169. 当前状态:52
  170. 当前金额:200
  171. 金钱增加了100,当前金钱为:300
  172. 当前状态:53
  173. 当前金额:300
  174. 金钱减少了一半,当前金钱为:150
  175. 金钱过少,恢复到以前的状态:
  176. 此时状态为:Menoy400 ,Fruits:[]
  177. 当前状态:54
  178. 当前金额:400
  179. 金钱减少了一半,当前金钱为:200
  180. 当前状态:55
  181. 当前金额:200
  182. 获得了水果:好吃的柚子,当前金钱为:200
  183. 当前状态:56
  184. 当前金额:200
  185. 金钱没有发生改变,当前金钱为:200
  186. 当前状态:57
  187. 当前金额:200
  188. 获得了水果:好吃的香蕉,当前金钱为:200
  189. 当前状态:58
  190. 当前金额:200
  191. 金钱没有发生改变,当前金钱为:200
  192. 当前状态:59
  193. 当前金额:200
  194. 获得了水果:香蕉,当前金钱为:200
  195. 当前状态:60
  196. 当前金额:200
  197. 获得了水果:苹果,当前金钱为:200
  198. 当前状态:61
  199. 当前金额:200
  200. 金钱没有发生改变,当前金钱为:200
  201. 当前状态:62
  202. 当前金额:200
  203. 金钱增加了100,当前金钱为:300
  204. 当前状态:63
  205. 当前金额:300
  206. 金钱没有发生改变,当前金钱为:300
  207. 当前状态:64
  208. 当前金额:300
  209. 金钱没有发生改变,当前金钱为:300
  210. 当前状态:65
  211. 当前金额:300
  212. 金钱没有发生改变,当前金钱为:300
  213. 当前状态:66
  214. 当前金额:300
  215. 金钱没有发生改变,当前金钱为:300
  216. 当前状态:67
  217. 当前金额:300
  218. 金钱减少了一半,当前金钱为:150
  219. 金钱过少,恢复到以前的状态:
  220. 此时状态为:Menoy400 ,Fruits:[]
  221. 当前状态:68
  222. 当前金额:400
  223. 金钱增加了100,当前金钱为:500
  224. 金钱增多,保存当前状态:
  225. 此时状态为:Menoy500 ,Fruits:[]
  226. 当前状态:69
  227. 当前金额:500
  228. 金钱增加了100,当前金钱为:600
  229. 金钱增多,保存当前状态:
  230. 此时状态为:Menoy600 ,Fruits:[]
  231. 当前状态:70
  232. 当前金额:600
  233. 金钱没有发生改变,当前金钱为:600
  234. 当前状态:71
  235. 当前金额:600
  236. 金钱没有发生改变,当前金钱为:600
  237. 当前状态:72
  238. 当前金额:600
  239. 金钱没有发生改变,当前金钱为:600
  240. 当前状态:73
  241. 当前金额:600
  242. 金钱增加了100,当前金钱为:700
  243. 金钱增多,保存当前状态:
  244. 此时状态为:Menoy700 ,Fruits:[]
  245. 当前状态:74
  246. 当前金额:700
  247. 金钱增加了100,当前金钱为:800
  248. 金钱增多,保存当前状态:
  249. 此时状态为:Menoy800 ,Fruits:[]
  250. 当前状态:75
  251. 当前金额:800
  252. 金钱没有发生改变,当前金钱为:800
  253. 当前状态:76
  254. 当前金额:800
  255. 获得了水果:好吃的柚子,当前金钱为:800
  256. 当前状态:77
  257. 当前金额:800
  258. 金钱没有发生改变,当前金钱为:800
  259. 当前状态:78
  260. 当前金额:800
  261. 金钱减少了一半,当前金钱为:400
  262. 当前状态:79
  263. 当前金额:400
  264. 金钱减少了一半,当前金钱为:200
  265. 金钱过少,恢复到以前的状态:
  266. 此时状态为:Menoy800 ,Fruits:[]
  267. 当前状态:80
  268. 当前金额:800
  269. 获得了水果:好吃的苹果,当前金钱为:800
  270. 当前状态:81
  271. 当前金额:800
  272. 金钱没有发生改变,当前金钱为:800
  273. 当前状态:82
  274. 当前金额:800
  275. 金钱没有发生改变,当前金钱为:800
  276. 当前状态:83
  277. 当前金额:800
  278. 获得了水果:好吃的柚子,当前金钱为:800
  279. 当前状态:84
  280. 当前金额:800
  281. 金钱没有发生改变,当前金钱为:800
  282. 当前状态:85
  283. 当前金额:800
  284. 金钱没有发生改变,当前金钱为:800
  285. 当前状态:86
  286. 当前金额:800
  287. 金钱增加了100,当前金钱为:900
  288. 金钱增多,保存当前状态:
  289. 此时状态为:Menoy900 ,Fruits:[好吃的苹果, 好吃的柚子]
  290. 当前状态:87
  291. 当前金额:900
  292. 金钱减少了一半,当前金钱为:450
  293. 当前状态:88
  294. 当前金额:450
  295. 金钱增加了100,当前金钱为:550
  296. 当前状态:89
  297. 当前金额:550
  298. 金钱增加了100,当前金钱为:650
  299. 当前状态:90
  300. 当前金额:650
  301. 金钱增加了100,当前金钱为:750
  302. 当前状态:91
  303. 当前金额:750
  304. 获得了水果:柚子,当前金钱为:750
  305. 当前状态:92
  306. 当前金额:750
  307. 金钱没有发生改变,当前金钱为:750
  308. 当前状态:93
  309. 当前金额:750
  310. 金钱增加了100,当前金钱为:850
  311. 当前状态:94
  312. 当前金额:850
  313. 金钱减少了一半,当前金钱为:425
  314. 金钱过少,恢复到以前的状态:
  315. 此时状态为:Menoy900 ,Fruits:[好吃的苹果, 好吃的柚子]
  316. 当前状态:95
  317. 当前金额:900
  318. 获得了水果:好吃的橘子,当前金钱为:900
  319. 当前状态:96
  320. 当前金额:900
  321. 金钱没有发生改变,当前金钱为:900
  322. 当前状态:97
  323. 当前金额:900
  324. 金钱增加了100,当前金钱为:1000
  325. 金钱增多,保存当前状态:
  326. 此时状态为:Menoy1000 ,Fruits:[好吃的苹果, 好吃的柚子, 好吃的橘子]
  327. 当前状态:98
  328. 当前金额:1000
  329. 金钱减少了一半,当前金钱为:500
  330. 当前状态:99
  331. 当前金额:500
  332. 金钱减少了一半,当前金钱为:250
  333. 金钱过少,恢复到以前的状态:
  334. 此时状态为:Menoy1000 ,Fruits:[好吃的苹果, 好吃的柚子, 好吃的橘子]

运行结果

   本程序的功能是根据循环次数随机的生成1~6这6个数字,如果数字是1,则金钱加一百,如果是二,则金钱减半,如果是6,则随机生成水果,水果分为好吃的和不好吃的,在保存的时候只保存好吃的水果,恢复的时候就只有好吃的水果了。当金钱少于当前备忘录中金钱的一半的时候就要恢复到备忘录的状态;当金钱大于备忘录的状态的时候就要备份当前的状态,备份的时候只备份好的水果以及当前金额,这就是游戏的功能,可以看到运行的结果的正确性。

  这里有几点要注意:

   2.1、窄接口和宽接口

   在代码中我已经标注出了窄接口和宽接口,如何定义这两种接口还要看这两种接口前面的修饰符,如果是默认的(只有本包的类可以使用),并且这些接口结合到一起可以完全的将本类的信息显示出来,那么就是宽接口;只能在本包之中使用,如果修饰符是public的接口,并且只能表示本类一部分信息,因为是public可以在其他包中使用的,就是窄接口,只能查看部分信息,因此是窄的。如下图所示,对于Main类所在的包,只能使用其他两个类中声明为public的字段和方法,因此在Main中只能使用窄接口来完成一定信息的读取getMenoy()。这只是一个概念,强调的是类、字段、方法的可见性。

  2.2、可见性

   同时我们也知道,public修饰的字段和方法在任何包中都可以使用,private修饰的字段和方法只能在本类之中使用,protected修饰的方法可以在本包之中以及该类的子类(可以在其他包)中使用,默认的没有任何修饰的可以在本包之中使用。这就是四种修饰关键字的可见性。在编程的时候我们一定要考虑这些问题,不然就会导致我们不想看到的字段、方法、类被误用的结果。

  2.3、将备份内容存盘并且读取

 Memento类:

  1. package zyr.dp.serializable;
  2.  
  3. import java.io.Serializable;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. public class Memento implements Serializable {

  8. private static final long serialVersionUID = 8497203738547925495L;
  9.  
  10. private int menoy;
  11. private ArrayList fruits;
  12.  
  13. //窄接口,访问部分信息
  14. public int getMenoy(){
  15. return menoy;
  16. }
  17.  
  18. //宽接口,本包之内皆可访问
  19. Memento(int menoy){
  20. this.menoy=menoy;
  21. fruits=new ArrayList();//每次调用的时候重新生成,很重要
  22. }
  23. //宽接口,本包之内皆可访问
  24. List getFruits(){
  25. return (List) fruits.clone();
  26. }
  27. //宽接口,本包之内皆可访问
  28. void addFruits(String fruit){
  29. fruits.add(fruit);
  30. }
  31.  
  32. }

 Gamer类:

  1. package zyr.dp.serializable;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Random;
  7.  
  8. public class Gamer {
  9.  
  10. private static String[] FruitsSame={"香蕉","苹果","橘子","柚子"};
  11.  
  12. private int menoy;
  13. private List fruits=new ArrayList();
  14. private Random random=new Random();
  15.  
  16. public int getMenoy(){
  17. return menoy;
  18. }
  19.  
  20. public Gamer(int menoy){
  21. this.menoy=menoy;
  22. }
  23.  
  24. public void bet(){
  25. int next=random.nextInt(6)+1;
  26. if(next==1){
  27. menoy+=100;
  28. System.out.println("金钱增加了100,当前金钱为:"+menoy);
  29. }else if(next==2){
  30. menoy/=2;
  31. System.out.println("金钱减少了一半,当前金钱为:"+menoy);
  32. }else if(next==6){
  33. String f=getFruit();
  34. fruits.add(f);
  35. System.out.println("获得了水果:"+f+",当前金钱为:"+menoy);
  36. }else {
  37. System.out.println("金钱没有发生改变,当前金钱为:"+menoy);
  38. }
  39. }
  40.  
  41. private String getFruit() {
  42.  
  43. String prefix="";
  44. if(random.nextBoolean()){
  45. prefix="好吃的";
  46. }
  47. return prefix+FruitsSame[random.nextInt(FruitsSame.length)];
  48.  
  49. }
  50.  
  51. public Memento createMemento(){
  52. Memento m=new Memento(menoy);
  53. Iterator it=fruits.iterator();
  54. while(it.hasNext()){
  55. String fruit=(String)it.next();
  56. if(fruit.startsWith("好吃的")){
  57. m.addFruits(fruit);
  58. }
  59. }
  60. return m;
  61. }
  62.  
  63. public void restoreMemento(Memento memento){
  64. this.menoy=memento.getMenoy();
  65. this.fruits=memento.getFruits();
  66. }
  67.  
  68. public String toString(){
  69. return "Menoy:"+menoy+" ,Fruits:"+fruits;
  70. }
  71.  
  72. }

 SerializableMain类:

  1. package zyr.dp.test;
  2.  
  3. import java.io.*;
  4.  
  5. import zyr.dp.serializable.Gamer;
  6. import zyr.dp.serializable.Memento;
  7.  
  8. public class SerializableMain {
  9.  
  10. private static String filename="game.dat";
  11. public static void main(String[] args) {
  12. Gamer gamer=new Gamer(100);
  13. Memento memento=loadMemento();

  14. 16 if(memento==null){
  15. 17 memento=gamer.createMemento();
  16. 18 }else{
  17. 19 System.out.println("从上次保存处开始...");
  18. 20 gamer.restoreMemento(memento);
  19. 21 }

  20. for(int i=0;i<100;i++){
  21. System.out.println("当前状态:"+i);
  22. System.out.println("当前金额:"+gamer.getMenoy());
  23. gamer.bet();
  24. if(gamer.getMenoy()<memento.getMenoy()/2){
  25. System.out.println("金钱过少,恢复到以前的状态:");
  26. gamer.restoreMemento(memento);
  27. System.out.println("此时状态为:"+gamer);
  28. }else if(gamer.getMenoy()>memento.getMenoy()){
  29. System.out.println("金钱增多,保存当前状态:");
  30. memento=gamer.createMemento();
  31. saveMemento(memento);
  32. System.out.println("此时状态为:"+gamer);
  33. }
  34. try {
  35. Thread.sleep(500);
  36. } catch (InterruptedException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40.  
  41. }
  42. private static void saveMemento(Memento memento) {
  43. try {
  44. ObjectOutput o=new ObjectOutputStream(new FileOutputStream(filename));
  45. o.writeObject(memento);
  46. o.close();
  47. } catch (FileNotFoundException e) {
  48. e.printStackTrace();
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. private static Memento loadMemento() {
  54. Memento memento=null;
  55. ObjectInput in;
  56. try {
  57. in = new ObjectInputStream(new FileInputStream(filename));
  58. memento=(Memento)in.readObject();
  59. in.close();
  60. } catch (FileNotFoundException e) {
  61. System.out.println(e.toString());
  62. } catch (IOException e) {
  63. e.printStackTrace();
  64. } catch (ClassNotFoundException e) {
  65. e.printStackTrace();
  66. }
  67. return memento;
  68. }

  69. }

运行结果:

初次运行:

  1. java.io.FileNotFoundException: game.dat (系统找不到指定的文件。)
  2. 当前状态:0
  3. 当前金额:100
  4. 获得了水果:好吃的苹果,当前金钱为:100
  5. 当前状态:1
  6. 当前金额:100
  7. 金钱没有发生改变,当前金钱为:100
  8. 当前状态:2
  9. 当前金额:100
  10. 金钱没有发生改变,当前金钱为:100
  11. 当前状态:3
  12. 当前金额:100
  13. 金钱没有发生改变,当前金钱为:100
  14. 当前状态:4
  15. 当前金额:100
  16. 获得了水果:苹果,当前金钱为:100
  17. 当前状态:5
  18. 当前金额:100
  19. 金钱没有发生改变,当前金钱为:100
  20. 当前状态:6
  21. 当前金额:100
  22. 金钱增加了100,当前金钱为:200
  23. 金钱增多,保存当前状态:
  24. 此时状态为:Menoy200 ,Fruits:[好吃的苹果, 苹果]
  25. 当前状态:7
  26. 当前金额:200
  27. 金钱没有发生改变,当前金钱为:200
  28. 当前状态:8
  29. 当前金额:200
  30. 金钱增加了100,当前金钱为:300
  31. 金钱增多,保存当前状态:
  32. 此时状态为:Menoy300 ,Fruits:[好吃的苹果, 苹果]
  33. 当前状态:9
  34. 当前金额:300
  35. 金钱没有发生改变,当前金钱为:300
  36. 当前状态:10
  37. 当前金额:300
  38. 获得了水果:橘子,当前金钱为:300
  39. 当前状态:11
  40. 当前金额:300
  41. 金钱没有发生改变,当前金钱为:300
  42. 当前状态:12
  43. 当前金额:300
  44. 金钱没有发生改变,当前金钱为:300
  45. 当前状态:13
  46. 当前金额:300
  47. 金钱增加了100,当前金钱为:400
  48. 金钱增多,保存当前状态:
  49. 此时状态为:Menoy400 ,Fruits:[好吃的苹果, 苹果, 橘子]
  50. 当前状态:14
  51. 当前金额:400
  52. 金钱没有发生改变,当前金钱为:400
  53. 当前状态:15
  54. 当前金额:400
  55. 金钱没有发生改变,当前金钱为:400
  56. 当前状态:16
  57. 当前金额:400
  58. 金钱减少了一半,当前金钱为:200
  59. 当前状态:17
  60. 当前金额:200
  61. 金钱没有发生改变,当前金钱为:200
  62. 当前状态:18
  63. 当前金额:200
  64. 金钱没有发生改变,当前金钱为:200
  65. 当前状态:19
  66. 当前金额:200
  67. 获得了水果:好吃的柚子,当前金钱为:200
  68. 当前状态:20
  69. 当前金额:200
  70. 获得了水果:好吃的柚子,当前金钱为:200
  71. 当前状态:21
  72. 当前金额:200
  73. 金钱减少了一半,当前金钱为:100
  74. 金钱过少,恢复到以前的状态:
  75. 此时状态为:Menoy400 ,Fruits:[好吃的苹果]
  76. 当前状态:22
  77. 当前金额:400
  78. 金钱减少了一半,当前金钱为:200
  79. 当前状态:23
  80. 当前金额:200
  81. 金钱没有发生改变,当前金钱为:200
  82. 当前状态:24
  83. 当前金额:200
  84. 金钱没有发生改变,当前金钱为:200
  85. 当前状态:25
  86. 当前金额:200
  87. 金钱增加了100,当前金钱为:300
  88. 当前状态:26
  89. 当前金额:300
  90. 金钱没有发生改变,当前金钱为:300
  91. 当前状态:27
  92. 当前金额:300
  93. 金钱减少了一半,当前金钱为:150
  94. 金钱过少,恢复到以前的状态:
  95. 此时状态为:Menoy400 ,Fruits:[好吃的苹果]
  96. 当前状态:28
  97. 当前金额:400
  98. 金钱没有发生改变,当前金钱为:400
  99. 当前状态:29
  100. 当前金额:400
  101. 获得了水果:香蕉,当前金钱为:400
  102. 当前状态:30
  103. 当前金额:400
  104. 金钱没有发生改变,当前金钱为:400
  105. 当前状态:31
  106. 当前金额:400
  107. 金钱减少了一半,当前金钱为:200
  108. 当前状态:32
  109. 当前金额:200
  110. 金钱没有发生改变,当前金钱为:200
  111. 当前状态:33
  112. 当前金额:200
  113. 获得了水果:柚子,当前金钱为:200
  114. 当前状态:34
  115. 当前金额:200
  116. 金钱减少了一半,当前金钱为:100
  117. 金钱过少,恢复到以前的状态:
  118. 此时状态为:Menoy400 ,Fruits:[好吃的苹果]
  119. 当前状态:35
  120. 当前金额:400
  121. 金钱没有发生改变,当前金钱为:400
  122. 当前状态:36
  123. 当前金额:400
  124. 获得了水果:橘子,当前金钱为:400
  125. 当前状态:37
  126. 当前金额:400
  127. 金钱没有发生改变,当前金钱为:400
  128. 当前状态:38
  129. 当前金额:400
  130. 金钱减少了一半,当前金钱为:200
  131. 当前状态:39
  132. 当前金额:200
  133. 获得了水果:好吃的橘子,当前金钱为:200
  134. 当前状态:40
  135. 当前金额:200
  136. 金钱没有发生改变,当前金钱为:200
  137. 当前状态:41
  138. 当前金额:200
  139. 金钱没有发生改变,当前金钱为:200
  140. 当前状态:42
  141. 当前金额:200
  142. 金钱没有发生改变,当前金钱为:200
  143. 当前状态:43
  144. 当前金额:200
  145. 金钱没有发生改变,当前金钱为:200
  146. 当前状态:44
  147. 当前金额:200
  148. 金钱没有发生改变,当前金钱为:200
  149. 当前状态:45
  150. 当前金额:200
  151. 金钱增加了100,当前金钱为:300
  152. 当前状态:46
  153. 当前金额:300
  154. 金钱减少了一半,当前金钱为:150
  155. 金钱过少,恢复到以前的状态:
  156. 此时状态为:Menoy400 ,Fruits:[好吃的苹果]
  157. 当前状态:47
  158. 当前金额:400
  159. 金钱没有发生改变,当前金钱为:400
  160. 当前状态:48
  161. 当前金额:400
  162. 金钱减少了一半,当前金钱为:200
  163. 当前状态:49
  164. 当前金额:200
  165. 获得了水果:柚子,当前金钱为:200
  166. 当前状态:50
  167. 当前金额:200
  168. 金钱没有发生改变,当前金钱为:200
  169. 当前状态:51
  170. 当前金额:200
  171. 金钱减少了一半,当前金钱为:100
  172. 金钱过少,恢复到以前的状态:
  173. 此时状态为:Menoy400 ,Fruits:[好吃的苹果]
  174. 当前状态:52
  175. 当前金额:400
  176. 获得了水果:香蕉,当前金钱为:400
  177. 当前状态:53
  178. 当前金额:400
  179. 金钱没有发生改变,当前金钱为:400
  180. 当前状态:54
  181. 当前金额:400
  182. 金钱增加了100,当前金钱为:500
  183. 金钱增多,保存当前状态:
  184. 此时状态为:Menoy500 ,Fruits:[好吃的苹果, 香蕉]
  185. 当前状态:55
  186. 当前金额:500
  187. 金钱减少了一半,当前金钱为:250
  188. 当前状态:56
  189. 当前金额:250
  190. 获得了水果:好吃的苹果,当前金钱为:250
  191. 当前状态:57
  192. 当前金额:250
  193. 金钱减少了一半,当前金钱为:125
  194. 金钱过少,恢复到以前的状态:
  195. 此时状态为:Menoy500 ,Fruits:[好吃的苹果]
  196. 当前状态:58
  197. 当前金额:500
  198. 金钱没有发生改变,当前金钱为:500
  199. 当前状态:59
  200. 当前金额:500
  201. 获得了水果:柚子,当前金钱为:500
  202. 当前状态:60
  203. 当前金额:500
  204. 金钱减少了一半,当前金钱为:250
  205. 当前状态:61
  206. 当前金额:250
  207. 金钱没有发生改变,当前金钱为:250
  208. 当前状态:62
  209. 当前金额:250
  210. 金钱增加了100,当前金钱为:350
  211. 当前状态:63
  212. 当前金额:350
  213. 金钱没有发生改变,当前金钱为:350
  214. 当前状态:64
  215. 当前金额:350
  216. 金钱减少了一半,当前金钱为:175
  217. 金钱过少,恢复到以前的状态:
  218. 此时状态为:Menoy500 ,Fruits:[好吃的苹果]
  219. 当前状态:65
  220. 当前金额:500
  221. 获得了水果:柚子,当前金钱为:500
  222. 当前状态:66
  223. 当前金额:500
  224. 金钱增加了100,当前金钱为:600
  225. 金钱增多,保存当前状态:
  226. 此时状态为:Menoy600 ,Fruits:[好吃的苹果, 柚子]
  227. 当前状态:67
  228. 当前金额:600
  229. 金钱没有发生改变,当前金钱为:600
  230. 当前状态:68
  231. 当前金额:600
  232. 金钱增加了100,当前金钱为:700
  233. 金钱增多,保存当前状态:
  234. 此时状态为:Menoy700 ,Fruits:[好吃的苹果, 柚子]
  235. 当前状态:69
  236. 当前金额:700
  237. 获得了水果:好吃的橘子,当前金钱为:700
  238. 当前状态:70
  239. 当前金额:700
  240. 金钱没有发生改变,当前金钱为:700
  241. 当前状态:71
  242. 当前金额:700
  243. 金钱没有发生改变,当前金钱为:700
  244. 当前状态:72
  245. 当前金额:700
  246. 获得了水果:香蕉,当前金钱为:700
  247. 当前状态:73
  248. 当前金额:700
  249. 金钱没有发生改变,当前金钱为:700
  250. 当前状态:74
  251. 当前金额:700
  252. 金钱没有发生改变,当前金钱为:700
  253. 当前状态:75
  254. 当前金额:700
  255. 金钱没有发生改变,当前金钱为:700
  256. 当前状态:76
  257. 当前金额:700
  258. 金钱没有发生改变,当前金钱为:700
  259. 当前状态:77
  260. 当前金额:700
  261. 金钱没有发生改变,当前金钱为:700
  262. 当前状态:78
  263. 当前金额:700
  264. 金钱没有发生改变,当前金钱为:700
  265. 当前状态:79
  266. 当前金额:700
  267. 金钱没有发生改变,当前金钱为:700
  268. 当前状态:80
  269. 当前金额:700
  270. 金钱增加了100,当前金钱为:800
  271. 金钱增多,保存当前状态:
  272. 此时状态为:Menoy800 ,Fruits:[好吃的苹果, 柚子, 好吃的橘子, 香蕉]
  273. 当前状态:81
  274. 当前金额:800
  275. 金钱增加了100,当前金钱为:900
  276. 金钱增多,保存当前状态:
  277. 此时状态为:Menoy900 ,Fruits:[好吃的苹果, 柚子, 好吃的橘子, 香蕉]
  278. 当前状态:82
  279. 当前金额:900
  280. 金钱没有发生改变,当前金钱为:900
  281. 当前状态:83
  282. 当前金额:900
  283. 获得了水果:柚子,当前金钱为:900
  284. 当前状态:84
  285. 当前金额:900
  286. 金钱减少了一半,当前金钱为:450
  287. 当前状态:85
  288. 当前金额:450
  289. 金钱没有发生改变,当前金钱为:450
  290. 当前状态:86
  291. 当前金额:450
  292. 金钱增加了100,当前金钱为:550
  293. 当前状态:87
  294. 当前金额:550
  295. 获得了水果:好吃的柚子,当前金钱为:550
  296. 当前状态:88
  297. 当前金额:550
  298. 金钱没有发生改变,当前金钱为:550
  299. 当前状态:89
  300. 当前金额:550
  301. 金钱没有发生改变,当前金钱为:550
  302. 当前状态:90
  303. 当前金额:550
  304. 金钱没有发生改变,当前金钱为:550
  305. 当前状态:91
  306. 当前金额:550
  307. 获得了水果:好吃的香蕉,当前金钱为:550
  308. 当前状态:92
  309. 当前金额:550
  310. 金钱减少了一半,当前金钱为:275
  311. 金钱过少,恢复到以前的状态:
  312. 此时状态为:Menoy900 ,Fruits:[好吃的苹果, 好吃的橘子]
  313. 当前状态:93
  314. 当前金额:900
  315. 金钱增加了100,当前金钱为:1000
  316. 金钱增多,保存当前状态:
  317. 此时状态为:Menoy1000 ,Fruits:[好吃的苹果, 好吃的橘子]
  318. 当前状态:94
  319. 当前金额:1000
  320. 获得了水果:橘子,当前金钱为:1000
  321. 当前状态:95
  322. 当前金额:1000
  323. 金钱减少了一半,当前金钱为:500
  324. 当前状态:96
  325. 当前金额:500
  326. 金钱没有发生改变,当前金钱为:500
  327. 当前状态:97
  328. 当前金额:500
  329. 金钱没有发生改变,当前金钱为:500
  330. 当前状态:98
  331. 当前金额:500
  332. 获得了水果:柚子,当前金钱为:500
  333. 当前状态:99
  334. 当前金额:500
  335. 获得了水果:柚子,当前金钱为:500

 第二次运行:

  1. 从上次保存处开始...
  2. 当前状态:0
  3. 当前金额:1000
  4. 金钱没有发生改变,当前金钱为:1000
  5. 当前状态:1
  6. 当前金额:1000
  7. 金钱增加了100,当前金钱为:1100
  8. 金钱增多,保存当前状态:
  9. 此时状态为:Menoy1100 ,Fruits:[好吃的苹果, 好吃的橘子]
  10. 当前状态:2
  11. 当前金额:1100
  12. 金钱增加了100,当前金钱为:1200
  13. 金钱增多,保存当前状态:
  14. 此时状态为:Menoy1200 ,Fruits:[好吃的苹果, 好吃的橘子]
  15. 当前状态:3
  16. 当前金额:1200
  17. 获得了水果:香蕉,当前金钱为:1200
  18. 当前状态:4
  19. 当前金额:1200
  20. 金钱没有发生改变,当前金钱为:1200
  21. 当前状态:5
  22. 当前金额:1200
  23. 金钱没有发生改变,当前金钱为:1200
  24. 当前状态:6
  25. 当前金额:1200
  26. 获得了水果:好吃的橘子,当前金钱为:1200
  27. 当前状态:7
  28. 当前金额:1200
  29. 金钱没有发生改变,当前金钱为:1200
  30. 当前状态:8
  31. 当前金额:1200
  32. 金钱没有发生改变,当前金钱为:1200
  33. 当前状态:9
  34. 当前金额:1200
  35. 获得了水果:好吃的苹果,当前金钱为:1200
  36. 当前状态:10
  37. 当前金额:1200
  38. 金钱没有发生改变,当前金钱为:1200
  39. 当前状态:11
  40. 当前金额:1200
  41. 金钱没有发生改变,当前金钱为:1200
  42. 当前状态:12
  43. 当前金额:1200
  44. 获得了水果:好吃的橘子,当前金钱为:1200
  45. 当前状态:13
  46. 当前金额:1200
  47. 获得了水果:好吃的柚子,当前金钱为:1200
  48. 当前状态:14
  49. 当前金额:1200
  50. 金钱没有发生改变,当前金钱为:1200
  51. 当前状态:15
  52. 当前金额:1200
  53. 金钱没有发生改变,当前金钱为:1200
  54. 当前状态:16
  55. 当前金额:1200
  56. 金钱没有发生改变,当前金钱为:1200
  57. 当前状态:17
  58. 当前金额:1200
  59. 获得了水果:苹果,当前金钱为:1200
  60. 当前状态:18
  61. 当前金额:1200
  62. 金钱没有发生改变,当前金钱为:1200
  63. 当前状态:19
  64. 当前金额:1200
  65. 金钱增加了100,当前金钱为:1300
  66. 金钱增多,保存当前状态:
  67. 此时状态为:Menoy1300 ,Fruits:[好吃的苹果, 好吃的橘子, 香蕉, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子, 苹果]
  68. 当前状态:20
  69. 当前金额:1300
  70. 金钱没有发生改变,当前金钱为:1300
  71. 当前状态:21
  72. 当前金额:1300
  73. 金钱减少了一半,当前金钱为:650
  74. 当前状态:22
  75. 当前金额:650
  76. 获得了水果:好吃的苹果,当前金钱为:650
  77. 当前状态:23
  78. 当前金额:650
  79. 金钱增加了100,当前金钱为:750
  80. 当前状态:24
  81. 当前金额:750
  82. 金钱减少了一半,当前金钱为:375
  83. 金钱过少,恢复到以前的状态:
  84. 此时状态为:Menoy1300 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  85. 当前状态:25
  86. 当前金额:1300
  87. 金钱没有发生改变,当前金钱为:1300
  88. 当前状态:26
  89. 当前金额:1300
  90. 金钱增加了100,当前金钱为:1400
  91. 金钱增多,保存当前状态:
  92. 此时状态为:Menoy1400 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  93. 当前状态:27
  94. 当前金额:1400
  95. 金钱没有发生改变,当前金钱为:1400
  96. 当前状态:28
  97. 当前金额:1400
  98. 金钱没有发生改变,当前金钱为:1400
  99. 当前状态:29
  100. 当前金额:1400
  101. 金钱增加了100,当前金钱为:1500
  102. 金钱增多,保存当前状态:
  103. 此时状态为:Menoy1500 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  104. 当前状态:30
  105. 当前金额:1500
  106. 金钱增加了100,当前金钱为:1600
  107. 金钱增多,保存当前状态:
  108. 此时状态为:Menoy1600 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  109. 当前状态:31
  110. 当前金额:1600
  111. 金钱没有发生改变,当前金钱为:1600
  112. 当前状态:32
  113. 当前金额:1600
  114. 金钱没有发生改变,当前金钱为:1600
  115. 当前状态:33
  116. 当前金额:1600
  117. 金钱没有发生改变,当前金钱为:1600
  118. 当前状态:34
  119. 当前金额:1600
  120. 金钱增加了100,当前金钱为:1700
  121. 金钱增多,保存当前状态:
  122. 此时状态为:Menoy1700 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  123. 当前状态:35
  124. 当前金额:1700
  125. 金钱没有发生改变,当前金钱为:1700
  126. 当前状态:36
  127. 当前金额:1700
  128. 金钱没有发生改变,当前金钱为:1700
  129. 当前状态:37
  130. 当前金额:1700
  131. 金钱没有发生改变,当前金钱为:1700
  132. 当前状态:38
  133. 当前金额:1700
  134. 金钱减少了一半,当前金钱为:850
  135. 当前状态:39
  136. 当前金额:850
  137. 金钱没有发生改变,当前金钱为:850
  138. 当前状态:40
  139. 当前金额:850
  140. 金钱没有发生改变,当前金钱为:850
  141. 当前状态:41
  142. 当前金额:850
  143. 金钱没有发生改变,当前金钱为:850
  144. 当前状态:42
  145. 当前金额:850
  146. 金钱没有发生改变,当前金钱为:850
  147. 当前状态:43
  148. 当前金额:850
  149. 金钱增加了100,当前金钱为:950
  150. 当前状态:44
  151. 当前金额:950
  152. 金钱减少了一半,当前金钱为:475
  153. 金钱过少,恢复到以前的状态:
  154. 此时状态为:Menoy1700 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  155. 当前状态:45
  156. 当前金额:1700
  157. 金钱没有发生改变,当前金钱为:1700
  158. 当前状态:46
  159. 当前金额:1700
  160. 金钱没有发生改变,当前金钱为:1700
  161. 当前状态:47
  162. 当前金额:1700
  163. 金钱没有发生改变,当前金钱为:1700
  164. 当前状态:48
  165. 当前金额:1700
  166. 金钱没有发生改变,当前金钱为:1700
  167. 当前状态:49
  168. 当前金额:1700
  169. 金钱增加了100,当前金钱为:1800
  170. 金钱增多,保存当前状态:
  171. 此时状态为:Menoy1800 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  172. 当前状态:50
  173. 当前金额:1800
  174. 金钱减少了一半,当前金钱为:900
  175. 当前状态:51
  176. 当前金额:900
  177. 金钱没有发生改变,当前金钱为:900
  178. 当前状态:52
  179. 当前金额:900
  180. 金钱没有发生改变,当前金钱为:900
  181. 当前状态:53
  182. 当前金额:900
  183. 金钱没有发生改变,当前金钱为:900
  184. 当前状态:54
  185. 当前金额:900
  186. 获得了水果:好吃的柚子,当前金钱为:900
  187. 当前状态:55
  188. 当前金额:900
  189. 金钱没有发生改变,当前金钱为:900
  190. 当前状态:56
  191. 当前金额:900
  192. 金钱没有发生改变,当前金钱为:900
  193. 当前状态:57
  194. 当前金额:900
  195. 获得了水果:好吃的柚子,当前金钱为:900
  196. 当前状态:58
  197. 当前金额:900
  198. 金钱减少了一半,当前金钱为:450
  199. 金钱过少,恢复到以前的状态:
  200. 此时状态为:Menoy1800 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  201. 当前状态:59
  202. 当前金额:1800
  203. 金钱增加了100,当前金钱为:1900
  204. 金钱增多,保存当前状态:
  205. 此时状态为:Menoy1900 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  206. 当前状态:60
  207. 当前金额:1900
  208. 金钱没有发生改变,当前金钱为:1900
  209. 当前状态:61
  210. 当前金额:1900
  211. 金钱没有发生改变,当前金钱为:1900
  212. 当前状态:62
  213. 当前金额:1900
  214. 金钱没有发生改变,当前金钱为:1900
  215. 当前状态:63
  216. 当前金额:1900
  217. 获得了水果:好吃的柚子,当前金钱为:1900
  218. 当前状态:64
  219. 当前金额:1900
  220. 金钱没有发生改变,当前金钱为:1900
  221. 当前状态:65
  222. 当前金额:1900
  223. 金钱减少了一半,当前金钱为:950
  224. 当前状态:66
  225. 当前金额:950
  226. 金钱没有发生改变,当前金钱为:950
  227. 当前状态:67
  228. 当前金额:950
  229. 获得了水果:柚子,当前金钱为:950
  230. 当前状态:68
  231. 当前金额:950
  232. 金钱减少了一半,当前金钱为:475
  233. 金钱过少,恢复到以前的状态:
  234. 此时状态为:Menoy1900 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  235. 当前状态:69
  236. 当前金额:1900
  237. 金钱减少了一半,当前金钱为:950
  238. 当前状态:70
  239. 当前金额:950
  240. 金钱没有发生改变,当前金钱为:950
  241. 当前状态:71
  242. 当前金额:950
  243. 金钱没有发生改变,当前金钱为:950
  244. 当前状态:72
  245. 当前金额:950
  246. 金钱没有发生改变,当前金钱为:950
  247. 当前状态:73
  248. 当前金额:950
  249. 金钱没有发生改变,当前金钱为:950
  250. 当前状态:74
  251. 当前金额:950
  252. 金钱增加了100,当前金钱为:1050
  253. 当前状态:75
  254. 当前金额:1050
  255. 金钱没有发生改变,当前金钱为:1050
  256. 当前状态:76
  257. 当前金额:1050
  258. 获得了水果:好吃的香蕉,当前金钱为:1050
  259. 当前状态:77
  260. 当前金额:1050
  261. 金钱没有发生改变,当前金钱为:1050
  262. 当前状态:78
  263. 当前金额:1050
  264. 金钱没有发生改变,当前金钱为:1050
  265. 当前状态:79
  266. 当前金额:1050
  267. 金钱没有发生改变,当前金钱为:1050
  268. 当前状态:80
  269. 当前金额:1050
  270. 金钱没有发生改变,当前金钱为:1050
  271. 当前状态:81
  272. 当前金额:1050
  273. 获得了水果:柚子,当前金钱为:1050
  274. 当前状态:82
  275. 当前金额:1050
  276. 金钱没有发生改变,当前金钱为:1050
  277. 当前状态:83
  278. 当前金额:1050
  279. 金钱没有发生改变,当前金钱为:1050
  280. 当前状态:84
  281. 当前金额:1050
  282. 金钱增加了100,当前金钱为:1150
  283. 当前状态:85
  284. 当前金额:1150
  285. 金钱没有发生改变,当前金钱为:1150
  286. 当前状态:86
  287. 当前金额:1150
  288. 金钱增加了100,当前金钱为:1250
  289. 当前状态:87
  290. 当前金额:1250
  291. 金钱减少了一半,当前金钱为:625
  292. 金钱过少,恢复到以前的状态:
  293. 此时状态为:Menoy1900 ,Fruits:[好吃的苹果, 好吃的橘子, 好吃的橘子, 好吃的苹果, 好吃的橘子, 好吃的柚子]
  294. 当前状态:88
  295. 当前金额:1900
  296. 获得了水果:苹果,当前金钱为:1900
  297. 当前状态:89
  298. 当前金额:1900
  299. 金钱减少了一半,当前金钱为:950
  300. 当前状态:90
  301. 当前金额:950
  302. 金钱没有发生改变,当前金钱为:950
  303. 当前状态:91
  304. 当前金额:950
  305. 获得了水果:好吃的橘子,当前金钱为:950
  306. 当前状态:92
  307. 当前金额:950
  308. 金钱没有发生改变,当前金钱为:950
  309. 当前状态:93
  310. 当前金额:950
  311. 金钱没有发生改变,当前金钱为:950
  312. 当前状态:94
  313. 当前金额:950
  314. 金钱没有发生改变,当前金钱为:950
  315. 当前状态:95
  316. 当前金额:950
  317. 金钱没有发生改变,当前金钱为:950
  318. 当前状态:96
  319. 当前金额:950
  320. 获得了水果:好吃的橘子,当前金钱为:950
  321. 当前状态:97
  322. 当前金额:950
  323. 金钱增加了100,当前金钱为:1050
  324. 当前状态:98
  325. 当前金额:1050
  326. 金钱没有发生改变,当前金钱为:1050
  327. 当前状态:99
  328. 当前金额:1050
  329. 金钱没有发生改变,当前金钱为:1050

第二次运行

  可以看到保存和读取成功。

三、总结

  备忘录模式也是一种比较常用的模式用来保存对象的部分用于恢复的信息,和原型模式有着本质的区别,广泛运用在快照功能之中,另外我们知道了宽接口和窄接口,这里的接口就是指的方法,没有其他意思,以及类的可见性。同样的使用备忘录模式可以使得程序可以组件化,比如打算多次撤销当前的状态,以及不仅可以撤销而且可以将当前的状态保存到文件之中的时候,我们不需要修改Gamer的代码就能做到,职责明确是一种非常重要的是软件工程思想。

北风设计模式课程---备忘录(Memento)模式的更多相关文章

  1. C++设计模式实现--备忘录(Memento)模式

    一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比較适用于功 ...

  2. 北风设计模式课程---访问者模式(Visitor)

    北风设计模式课程---访问者模式(Visitor) 一.总结 一句话总结: 设计模式是日常问题的经验总结方案,所以学好设计模式对日常出现的问题可以有很好的解决. 访问者设计模式有点神似 抽象工厂模式, ...

  3. 北风设计模式课程---访问者(Visitor)模式

    北风设计模式课程---访问者(Visitor)模式 一.总结 一句话总结: 设计模式是日常问题的经验总结方案,所以学好设计模式对日常出现的问题可以有很好的解决. 访问者设计模式有点神似 抽象工厂模式, ...

  4. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  5. 北风设计模式课程---解释器模式(Interpreter Pattern)

    北风设计模式课程---解释器模式(Interpreter Pattern) 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用 ...

  6. 北风设计模式课程---外观模式(Facade)总结

    北风设计模式课程---外观模式(Facade)总结 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装备 ...

  7. 北风设计模式课程---开放封闭原则(Open Closed Principle)

    北风设计模式课程---开放封闭原则(Open Closed Principle) 一.总结 一句话总结: 抽象是开放封闭原则的关键. 1."所有的成员变量都应该设置为私有(Private)& ...

  8. 北风设计模式课程---接口分离原则(Interface Segregation Principle)

    北风设计模式课程---接口分离原则(Interface Segregation Principle) 一.总结 一句话总结: 接口分离原则描述为 "客户类不应被强迫依赖那些它们不需要的接口& ...

  9. 北风设计模式课程---最少知识原则(Least Knowledge Principle)

    北风设计模式课程---最少知识原则(Least Knowledge Principle) 一.总结 一句话总结: 最少知识原则(Least Knowledge Principle),或者称迪米特法则( ...

随机推荐

  1. Node.js实战11:fs模块初探。

    fs模块封装了对文件操作的各种方法,比如同步和异步读写.批量操作.流.监听. 我们还是通常例程学习, 获取目录下的文件清单: var fs =require("fs"); fs.r ...

  2. python中pycharm中.py文件调用一个.py文件的函数

    在相同文件夹内调用函数: file1.py def add(x,y): print('和为:%d'%(x+y)) file2.py import A A.add(1,2)

  3. Java日志使用slf4j 配置log4j后,有日志文件 但日志文件内容为空

    SLF4J的全称是Simple Logging Facade for Java,即简单日志门面. SLF4J并不是具体的日志框架,而是作为一个简单门面服务于各类日志框架,如java.util.logg ...

  4. 词频统计小程序-WordCount.exe

    一. 背景 ​ 最近顶哥为了完成学历提升学业中的小作业,做了一个词频统计的.exe小程序.因为当时做的时候网上的比较少,因此顶哥决定把自己拙略的作品发出来给需要的人提供一种思路,希望各位看官不要dis ...

  5. 入门级,关于下载设置wamp的安装

    将wamp下载下来,分清楚自己电脑是32还是64位,在安装之前,首先确定你电脑里安装了vc++ 的运行库,不然安装wamp后会出现提醒缺少XXX文件,但是注意,在安装vc运行库的时候,请搜索集合包类的 ...

  6. 使用Jest测试JavaScript (入门篇)

    1 什么是 Jest? Jest是 Facebook 的一套开源的 JavaScript 测试框架, 它自动集成了断言.JSDom.覆盖率报告等开发者所需要的所有测试工具,是一款几乎零配置的测试框架. ...

  7. 20191126PHP连接数据(1)

    引进数据 mysql> create database stu1 character set utf8; mysql> use stu1 mysql> set names utf8; ...

  8. 只要三步,你就可以在github上发布网站了

    今天,看到github推送了一个新的消息,Publishing with GitHub Pages, now as easy as 1, 2, 3.总结起来就是在github将你的文档或者发布网页将会 ...

  9. 跨域问题解决----NO 'Access-Control-Allow-Origin' header is present on the requested resource.Origin'http://localhost:11000' is therfore not allowed access'

    NO 'Access-Control-Allow-Origin' header is present on the requested resource.Origin'http://localhost ...

  10. vue回到顶部

    backTop() { var top = document.body.scrollTop || document.documentElement.scrollTop; this.duration - ...