备忘录模式-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. 八皇后问题(C#)

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

  2. 如何将外部数据库 导入到系统的SQL中

    打开数据库sql管理  在数据库中新建查询  如何输入: exec sp_attach_db @dbname='YourDataBaseName', @filename1='mdf文件路径', @fi ...

  3. hashtable 简单介绍

    Hashtable 1 注意小写 table 2 常用方法 void                clear() boolean             contains(Object value) ...

  4. Flink应用案例:How Trackunit leverages Flink to process real-time data from industrial IoT devices

    January 22, 2019Use Cases, Apache Flink Lasse Nedergaard     Recently there has been significant dis ...

  5. 如何在element-UI 组件的change事件中传递自定义参数

    以select为例,如果select写在循环里,触发change事件时可能不只需要传递被选中项的值,还要传递index过去,来改变同一循环中的其他标签的状态. 下面这样写是无效的: @change=& ...

  6. 【spring源码分析】IOC容器初始化(六)

    前言:经过前几篇文章的讲解,我们已经得到了BeanDefinition,接下来将分析Bean的加载. 获取Bean的入口:AbstractApplicationContext#getBean publ ...

  7. Android高版本联网失败报错:Cleartext HTTP traffic to xxx not permitted解决方法

    前言:为保证用户数据和设备的安全,Google针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的 ...

  8. Elasticsearch 通关教程(四): 分布式工作原理

    前言 通过前面章节的了解,我们已经知道 Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你以一个之前从未有过的速度和规模,去探索你的数据.它被用作全文检索.结构化搜索.分析以及这三个 ...

  9. Web前端之iframe详解

    iframe基本内涵 通常我们使用iframe直接直接在页面嵌套iframe标签指定src就可以了. <iframe src="demo_iframe_sandbox.htm" ...

  10. Git使用(积累一些常用的命令)

    1. 取消某一次合并  git merge --abort 可以参考的教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248 ...