备忘录模式-Memento Pattern(Java实现)
备忘录模式-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实现)的更多相关文章
- 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...
- 二十四种设计模式:备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...
- 23.备忘录模式(Memento Pattern)
using System; using System.Collections.Generic; namespace ConsoleApplication6 { /// <summary> ...
- [设计模式] 18 备忘录模式Memento Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...
- 备忘录模式-Memento Pattern
1.主要优点 备忘录模式的主要优点如下: (1)它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原. (2) ...
- 用最简单的例子理解备忘录模式(Memento Pattern)
简单来说,备忘录模式就是支持回退操作.假设让一个Notepad支持回退操作,如何实现呢? 首先需要一个备忘录类. public class Memento { private string _msg; ...
- php备忘录模式(memento pattern)
晚上刷起来. <?php /* The memento pattern provides the object restore functionality. Implementation is ...
- 十一个行为模式之备忘录模式(Memento Pattern)
定义: 在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存.当对象出错或者无效是,可以根据该备忘录进行恢复. 结构图: Originator:原发类,被记录的对象,包含若干内部状态.一 ...
- Java 设计模式系列(十八)备忘录模式(Memento)
Java 设计模式系列(十八)备忘录模式(Memento) 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式.备忘录对象是一个用来存储另外一个对象内部状态 ...
随机推荐
- 读书笔记之_Win10 与Jmeter5.1.1界面兼容:
读书笔记之win10 与jmeter5.1.1界面兼容: 调整前:
- Nginx设置Https反向代理,指向Docker Gitlab11.3.9 Https服务
目录 目录 1.GitLab11.3.9的安装 2.域名在阿里云托管,申请免费的1年证书 3.Gitlab 的 https 配置 4.Nginx 配置 https,反向代理指向 Gitlab 配置 目 ...
- iOS 多线程 NSOperation、NSOperationQueue
1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...
- Linux学习历程——Centos 7 passwd命令
一.命令介绍 passwd 命令用于修改用户密码,过期时间,认证信息等. 普通用户只能使用 passwd 命令修改自身的系统密码,而 root 管理员则有权限修改其他所有人的密码.更酷的是,root ...
- #032 有空就看PTA
我咋买书了? 上学期
- Java 8 Stream介绍及使用2
(原) stream中另一些比较常用的方法. 1. public static<T> Stream<T> generate(Supplier<T> s) 通过gen ...
- 关于ES6的module的循环加载
今天写js时,碰到了一个模块循环加载的错误,下面时例子: // testa.mjs import testb from './testb.mjs'; const {b} = testb; const ...
- ecshop 商品属性显示方法
功能:在商品列表上,点击放大镜,显示商品所有属性以及其价格,效果如下: 方法/步骤: 1.编辑\admin\templates\goods_list.htm 模板,在 <!-- 商品搜索 --& ...
- 二、Redis安装
一.下载Redis: 下载地址:https://github.com/MSOpenTech/redis/releases. 由于redis并不支持window系统,而window版本的redis的是由 ...
- DELPHI中build和compile有什么区别?
Build编译全部与工程相关联的文件,可包括版本信息及工程中的预编译变量等:Compile只重新编译更改过的相关单元及文件,调试是Compile就可以了,若是发布,则Build为好 BUILD =C ...