php设计模式之备忘模式分析【星际争霸游戏案例】


Posted in PHP onMarch 24, 2020

本文实例讲述了php设计模式之备忘模式。分享给大家供大家参考,具体如下:

我们在玩星际任务版或者单机与电脑对战的时候,有时候会突然要离开游戏,或者在出兵前面,需要存储一下游戏。

那么我们通过什么办法来保存目前的信息呢?而且在任何时候,可以恢复保存的游戏呢?

待解决的问题:保存游戏的一切信息,如果恢复的时候完全还原。

思路:建立一个专门保存信息的类,让他来处理这些事情,就像一本备忘录。

为了简单,我们这里用恢复一个玩家的信息来演示。

备忘(Memento)模式示例:

<?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();

  //假设他现在采了100水晶矿
  $p1->ore = 100;

  //我们先保存游戏,然后继续玩游戏
  $m = $p1->getMemento();

  //假设他现在采了200水晶矿
  $p1->ore = 200;

  //我们现在载入原来保存的游戏
  $p1->restore($m);

  //输出水晶矿,可以看到已经变成原来保存的状态了
  echo $p1->ore;
?>

用途总结:备忘模式使得我们可以保存某一时刻为止的信息,然后在需要的时候,将需要的信息恢复,就像游戏的保存和载入归档一样。

实现总结:需要一个备忘类来保存信息,被保存的类需要实现生成备忘对象的方法,以及调用备忘对象来恢复自己状态的方法。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP系统流量分析的程序
Oct 09 PHP
使用PHP数组实现无限分类,不使用数据库,不使用递归.
Dec 09 PHP
收集的php编写大型网站问题集
Mar 06 PHP
PHP获取类中常量,属性,及方法列表的方法
Apr 09 PHP
使用NetBeans + Xdebug调试PHP程序的方法
Apr 12 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
Oct 29 PHP
php使用json_encode对变量json编码
Apr 07 PHP
php实现的支持断点续传的文件下载类
Sep 23 PHP
PHP屏蔽过滤指定关键字的方法
Nov 03 PHP
如何利用http协议发布博客园博文评论
Aug 03 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
php实现多站点共用session实现单点登录的方法详解
Sep 18 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 #PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
PHP中关于php.ini参数优化详解
Feb 28 #PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 #PHP
php 的多进程操作实践案例分析
Feb 28 #PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 #PHP
php的无刷新操作实现方法分析
Feb 28 #PHP
You might like
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
基于Jquery的温度计动画效果
2010/06/18 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
Python生成不重复随机值的方法
2015/05/11 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
Python callable()函数用法实例分析
2018/03/17 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
Python实现TCP通信的示例代码
2019/09/09 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
绝对经典成功的大学生推荐信
2013/11/08 职场文书
自我推荐书
2013/12/04 职场文书
公司培训心得体会
2014/01/03 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
辛亥革命观后感
2015/06/02 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android