备忘模式

<?php

//备忘类
class Memento
{
    public $ore;//水晶矿
    public $gas;//气矿
    public $troop;//玩家所有的部队对象
    public $building;//玩家所有的建筑对象
    //构造方法,参数为要保存的玩家的对象,这里强制参数的类型为Player类
    public function __construct(Player $player)
    {
        $this->ore = $player->ore;//保存这个玩家的水晶矿
        $this->gas = $player->gas;//保存这个玩家的气矿
        $this->troop = $player->troop;//保存这个玩家所有的部队对象
        $this->building = $player->building;//保存这个玩家所有的建筑对象
    }
}

//玩家的类
class Player
{
    public $ore;//水晶矿
    public $gas;//气矿
    public $troop;//玩家所有的部队对象
    public $building;//玩家所有的建筑对象
    //保存这个玩家的备忘对象
    public function getMemento()
    {
        return new Memento($this);
    }
    //用这个玩家的备忘对象来恢复这个玩家,这里强制参数的类型为Memento类
    public function restore(Memento $m)
    {
        $this->ore = $m->ore;//水晶矿
        $this->gas = $m->gas;//气矿
        $this->troop = $m->troop;//玩家所有的部队对象
        $this->building = $m->building;//玩家所有的建筑对象
    }
}

$p1 = new Player();//制造一个玩家
$p1->ore = 100;//假设他现在采了100水晶矿
echo $p1->ore;

echo ‘<br>‘;

$m = $p1->getMemento();//我们先保存游戏,然后继续玩游戏
$p1->ore = 200;//假设他现在采了200水晶矿
echo $p1->ore;

echo ‘<br>‘;

$p1->restore($m);//我们现在载入原来保存的游戏
echo $p1->ore;//输出水晶矿,可以看到已经变成原来保存的状态了

echo ‘<br>‘;

?>
时间: 2024-12-22 19:50:51

备忘模式的相关文章

PHP设计模式之备忘模式

1.Norton Ghost的方便与问题 我们大多数win的用户都用过Norton Ghost,只要将目前系统备份一下生成镜像文件,等系统中毒或崩溃的时候,用Norton Ghost恢复一下就回到备份时候的样子了. 这个可以说就是备忘(Memento)模式的基本原理了,先备份,需要的时候恢复.因此备忘模式是比较好理解的. 但在实际应用中,如何正确的应用备忘模式,是需要注意的. 难道我们在word写文章的时候,先要Ghost备份一下所有的硬盘,一旦文章写错了,需要恢复,就用Ghost覆盖硬盘? 就

Javascript备忘模式

使用备忘模式,利用了函数的自定义属性,先看一个例子 var test = function (){} test.myAttr = "attr"; 这样,就给test加上了一个自定义的属性,myAttr. 备忘模式,正式利用了这个方法,将已经运行过的结果存储起来,将函数接受到的参数作为key,将函数运行的结果作为value返回即可.代码如下 var myFunc = function (param) { if(!myFunc.cache[param]){ var result = {};

11. 星际争霸之php设计模式--备忘模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248190.html============================================

RxJava & RxAndroid备忘

"你问我要去向何方,我指着大海的方向" 今天在刷G+的时候看到Dave Smith推荐了一个视频 <Learning RxJava (for Android) by example> 点进去看了一下,原来是位熟悉的"阿三哥",视频封面如下:(没有歧视的意思,不要喷我啊~,为什么感到熟悉?接着往下看) 几乎同时也看到了JetBrains在G+也推荐了篇在Medium上的博文 <RxAndroid And Kotlin (Part 1)> ,然后

Table view 备忘

Table view 备忘 本篇会以备忘为主,主要是一些基础的代理方法和数据源方法具体的优化好点子会后续跟上. Table view的数据源方法 必须实现的数据源方法 // 返回每一行的cell,可以做缓存处理,同样也可能会造成复用问题. func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // tableview 和 cell 都是在s

调试android chrome web page简明备忘

必备工具 adb tools.android chrome 先开启手机调试模式 adb forward tcp:9919 localabstract:chromedevtoolsremote 成功会提示 * daemon not running. starting it now on port 5037 * * daemon started successfully * 不成功的话用这个命令再试 adb kill-server 接着打开下面的链接,这里的9919是上面adb命令中指定的 http

代码整洁备忘(一)

无聊在看<代码整洁之道>,找到了一些自己以前没有注意的地方,在这里记录下来,备忘一下. 目前看完了第九章. 1.重复很多的代码是不好的,需要仔细考虑去掉无用的重复. 2.变量,函数,类等的命名要足够精确,精简&易于搜索. 3.函数尽可能的少用参数(3个以内),&不要向函数内传递bool,因为这明确的说明了这个函数干的不是一件事!函数的职责应该是单一的.函数应该尽可能的短小,过长的函数是不好的. 4.注释,能不用就不用,能少用就少用.能用好的名字说明的问题就不要用注释来说明.标记

移动端开发备忘

这是一些移动端开发的备忘记录. <meta> 元素 <meta name=“viewport” content=“width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no”/> width:宽度(数值 / device-width)(范围从200 到10,000,默认为980 像素) height:高度(数值 / device-height)(范围从223 到10,000) initial-s

正则表达式入门及备忘

概述 正则表达式,主要是用符号描述了一类特定的文本(模式).而正则表达式引擎则负责在给定的字符串中,查找到这一特定的文本. 本文主要是列出常用的正则表达式符号,加以归类说明.本文仅仅是快速理解了正则表达式相关元字符,作一个备忘,供以后理解更复杂表达式的参考,以后关于正则表达式的相关内容会持续更新本文.示例语言用C# 概述 普通字符 字符集合 速记的字符集合 指定重复次数的字符 匹配位置字符 分支替换字符 匹配特殊字符 组,反向引用,非捕获组 贪婪与非贪婪 回溯与非回溯 正向预搜索.反向预搜索 最