设计模式之——Memento模式
Memento模式即快照模式,就是在某一时刻,设定一个状态,在后面随时可以返回到当前状态的模式。
我们拿一个闯关游戏作为举例,一共有十关,每闯一关,玩家所持金额增加一百,而闯关失败就扣一百。初始时,给玩家一百块作为闯关资金,如果十关全部闯玩,并且玩家手中金额不小于0,则胜利,当玩家所持金额小于0,则视为闯关失败,直接退出。
下面看案例代码,有一个玩家类
- gamer
package site.wangxin520.gof.memento.demo.game; import java.util.Random; /**
* 游戏的类
* @author wangXgnaw
*
*/
public class Gamer { /**
* 玩家所持有的金钱
*/
private int money;
private Random random = new Random(); /**
* 创建玩家,设置初始化money
* @param money
*/
public Gamer(int money) {
this.money = money;
} /**
* 获取玩家当前所持有的金钱
* @return
*/
public int getMoney() {
return money;
} /**
* 玩游戏的方法
*/
public void play(){ //要么闯关成功
if(random.nextBoolean()){
System.out.println("闯关成功,加一百块");
this.money+=100;
}else{
System.out.println("闯关失败,扣两百块");
this.money-=200;
} } @Override
public String toString() {
return "玩家当前有现金: [money=" + money + "]";
} }
- test测试类
package site.wangxin520.gof.memento.demo; import site.wangxin520.gof.memento.demo.game.Gamer; /**
* 快照模式的一个测试类
* @author wangXgnaw
*
*/
public class Test { public static void main(String[] args) {
Gamer gamer = new Gamer(100); System.out.println("初始时候,玩家状态为:"+gamer); //玩十局游戏
for (int i = 0; i < 10; i++) { gamer.play(); System.out.println("第"+(i+1)+"局的时候,玩家状态为:"+gamer); //判断游戏结束
if(gamer.getMoney()<0){
System.out.println("玩家失败");
break;
}
}
System.out.println(); } }
- 此时运行后控制台为:
玩家玩到第三局的时候,就失败了。同样多测试几次后也类似,少有的一路顺风直到最后的。可见,这个游戏是有难度的,那么我们怎么去百分百的成功呢。
假设我们设置,在游戏开始前,设置一个快照,保存游戏进度,当游戏开始后,赢了的话,就更新进度,输了的话,就重新开始当前的关卡。
- 我们设置了一个快照类,用于保存进度的
package site.wangxin520.gof.memento.demo.game; /**
* 游戏的快照的类,当需要爆粗的时候,保存一下进度,用于快速恢复!
* @author wangXgnaw
*
*/
public class Memento { //保存游戏里面的钱
private int money; /**
* 构造函数,创建一个快照
* 限定为只能本包中调用
*/
Memento(int money) {
this.money=money;
} /**
* 获取快照保存的钱,这里方法的权限为本包中
* @return
*/
int getMoney() {
return money;
}
}
- 修改一下玩家类
package site.wangxin520.gof.memento.demo.game; import java.util.Random; /**
* 游戏的类
* @author wangXgnaw
*
*/
public class Gamer { /**
* 玩家所持有的金钱
*/
private int money;
private Random random = new Random(); /**
* 创建玩家,设置初始化money
* @param money
*/
public Gamer(int money) {
this.money = money;
} /**
* 获取玩家当前所持有的金钱
* @return
*/
public int getMoney() {
return money;
} /**
* 玩游戏的方法
*/
public void play(){ //要么闯关成功
if(random.nextBoolean()){
System.out.println("闯关成功,加一百块");
this.money+=100;
}else{
System.out.println("闯关失败,扣两百块");
this.money-=200;
} } /**
* 创建快照,当前的所持的金额
* @return Memento 返回一个快照
*/
public Memento createMemento(){
return new Memento(this.money);
} /**
* 回退到快照
* @param memento
*/
public void restoreMemento(Memento memento){
this.money=memento.getMoney();
} /**
* 查看快照里面的钱
* @return
*/
public int getMementoState(Memento memento){
return memento.getMoney();
} @Override
public String toString() {
return "玩家当前有现金: [money=" + money + "]";
} }
- 测试类也修改了一下,当成功,就更新进度,当不成功,就回退
package site.wangxin520.gof.memento.demo; import site.wangxin520.gof.memento.demo.game.Gamer;
import site.wangxin520.gof.memento.demo.game.Memento; /**
* 快照模式的一个测试类
* @author wangXgnaw
*
*/
public class Test { public static void main(String[] args) {
Gamer gamer = new Gamer(100); System.out.println("初始时候,玩家状态为:"+gamer); //设置一个快照
Memento memento=gamer.createMemento(); //玩十局游戏
for (int i = 0; i < 10; i++) { gamer.play(); //当钱减少后,就说明了玩家本局闯关失败,那么就回退回去
if(gamer.getMoney()<gamer.getMementoState(memento)){
gamer.restoreMemento(memento);
//并且,本局重新来过!
i--;
}else{
//本次闯关成功,更新快照
memento=gamer.createMemento();
} System.out.println("第"+(i+1)+"局的时候,玩家状态为:"+gamer); //判断游戏结束
if(gamer.getMoney()<0){
System.out.println("玩家失败");
break;
}
}
System.out.println(); } }
- 此时控制台输出就变成了:
当闯关失败时候,就恢复到快照,成功就继续闯关。这样一来,基本上就是百试不爽的,次次成功了。哈哈哈!!!
设计模式之——Memento模式的更多相关文章
- 设计模式:memento模式
目的:在不破坏系统封装性的前提下,记录系统每一步的状态,可以做到状态回退和前进 方法: 定义一个数据类,保存所有相关数据 定义一个管理类,提供保存和恢复的接口 具体操作类调用管理类的保存和恢复接口 例 ...
- 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...
- Java设计模式(15)备忘录模式(Memento模式)
Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...
- 设计模式之备忘录模式(Memento)
备忘录模式(Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Originator(发起人):负责创建一个备忘录 ...
- Memento模式(备忘录设计模式)
Memento模式? 使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态.这个时候你需要使用Memento设计模式.(以 ...
- C#设计模式:备忘录模式(Memento Pattern)
一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...
- 23种设计模式之备忘录模式(Memento)
备忘录模式确保在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态.备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定 ...
- C++设计模式实现--备忘录(Memento)模式
一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比較适用于功 ...
- 设计模式(十八)Memento模式
在使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态. 要想恢复实例,需要一个可以自由访问实例内部结构的权限.但是,如果 ...
随机推荐
- linux -- Linux下的五个查找命令:grep、find、locate、whereis、which
1.grep grep(General Regular Expression Parser,通用规则表达式分析程序)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. 它的使 ...
- 【Java NIO深入研究3】文件锁
1.1概述——文件锁 文件锁定初看起来可能让人迷惑.它 似乎 指的是防止程序或者用户访问特定文件.事实上,文件锁就像常规的 Java 对象锁 — 它们是 劝告式的(advisory) 锁.它们不阻止任 ...
- ASP.NET WebApi 路由配置【转】
一.路由介绍 ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们 ...
- C++ 对象间的赋值与拷贝构造函数
1.对象间的赋值 /***A.h文件***/ #pragma once class A { public: int va; A(void); A(char* name); A(const A& ...
- Effective C++ Item 19 Treat class design as type design
Too high class topic for me now ................... ................... ................... fill the ...
- swift - UIAlertView 的用法
1,创建一个alertview,并带有“确定”和“取消”两个按钮 (注:在这里使用alertview,会报警告,那是因为从ios 8 以后,建议使用UIAlertviewController) //警 ...
- EHcache经典配置
记录重要的东西和常用的东西. <ehcache> <!-- 指定一个文件目录,当EHCache把数据写到硬盘上时,将把数据写到这个文件目录下 --> <diskStore ...
- kafka原理
今天因为工作接触kafka,先说说kafka是干嘛的. kafka: 说简单点他就是一个基于分布式的消息发布-订阅系统. 然后再理解一些专有名词: Kafka 专用术语 Broker:Kafka 集群 ...
- RF-template使用
在测试案例中,可以使用template设置进行数据驱动的测试,template设置方法: 在设置项中填写模板的关键字名称,测试案例本身只能包含template关键字使用的数据: *** Setting ...
- AFNetworking 上传文件
本文转载至 http://blog.csdn.net/hmt20130412/article/details/36487055 文件上传AFNetworking @第一种:我的 #pragma mar ...