备忘录模式-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("");
}
}
}

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

备忘录模式-Memento Pattern(Java实现)的更多相关文章

  1. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  2. 二十四种设计模式:备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...

  3. 23.备忘录模式(Memento Pattern)

    using System; using System.Collections.Generic; namespace ConsoleApplication6 { /// <summary> ...

  4. [设计模式] 18 备忘录模式Memento Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...

  5. 备忘录模式-Memento Pattern

    1.主要优点 备忘录模式的主要优点如下: (1)它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原. (2) ...

  6. 用最简单的例子理解备忘录模式(Memento Pattern)

    简单来说,备忘录模式就是支持回退操作.假设让一个Notepad支持回退操作,如何实现呢? 首先需要一个备忘录类. public class Memento { private string _msg; ...

  7. php备忘录模式(memento pattern)

    晚上刷起来. <?php /* The memento pattern provides the object restore functionality. Implementation is ...

  8. 十一个行为模式之备忘录模式(Memento Pattern)

    定义: 在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存.当对象出错或者无效是,可以根据该备忘录进行恢复. 结构图: Originator:原发类,被记录的对象,包含若干内部状态.一 ...

  9. Java 设计模式系列(十八)备忘录模式(Memento)

    Java 设计模式系列(十八)备忘录模式(Memento) 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式.备忘录对象是一个用来存储另外一个对象内部状态 ...

随机推荐

  1. docker 集群 zookeeper 碰到 java.net.NoRouteToHostException: Host is unreachable (Host unreachable)

    最近在学 zookeeper ,按照 docker 官网的方式集群 zookeeper , 然后发现有路由找不到.最后问题解决了,随手记录下来. 原因是 firewalld 的没有信任 docker ...

  2. Go语言打造以太坊智能合约测试框架(level1)

    传送门: 柏链项目学院 Go语言打造以太坊智能合约测试框架 前言 这是什么? 这是一个基于go语言编写的,自动化测试以太坊智能合约的开发框架,使用此框架,可以自动化的部署合约,自动测试合约内的功能函数 ...

  3. MySQL(InnoDB)是如何处理死锁的

    MySQL(InnoDB)是如何处理死锁的 一.什么是死锁 官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁. 这个就好比你有一个人质,对方有一个人质,你们俩去 ...

  4. 我的第一个python web开发框架(40)——后台日志与异常处理

    后台权限和底层框架的改造终于完成了,小白也终于可以放下紧悬着的心,可以轻松一下了.这不他为了感谢老菜,又找老菜聊了起来. 小白:多谢老大的帮忙,系统终于改造完成了,可以好好放松一下了. 老菜:呵呵,对 ...

  5. #032 有空就看PTA

      我咋买书了? 上学期

  6. WPF 控件之 Popup

    1.经常使用属性说明 IsOpen: 布尔值,指示 Popup 控件是否显示 StaysOpen: 布尔值,指示在 Popup 控件失去焦点的时候,是否关闭 Popup 控件的显示 PopupAnim ...

  7. UI自动化测试之Jenkins配置

    前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家. 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化 ...

  8. 最新版jQuery v3.3.1的BUG以及解决办法(什么问题不重要,怎么解决问题才重要)

    发现问题 最新版的 FineUIPro v5.2.0 中,我们将内置的 jQuery v1.12.4 升级到 jQuery v3.3.1 ,可以看升级记录: +升级到jQuery v3.3.1.    ...

  9. 关于ES6的module的循环加载

    今天写js时,碰到了一个模块循环加载的错误,下面时例子: // testa.mjs import testb from './testb.mjs'; const {b} = testb; const ...

  10. iview table内渲染proptip组件

    渲染proptip组件 columns: [{ title: '产品图', key: 'pic', sortable: true, render: function(h, para){ return ...