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+SqlServer实现分页显示
Oct 09 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
Sep 22 PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 PHP
php管理nginx虚拟主机shell脚本实例
Nov 19 PHP
PHP图像处理类库MagickWand用法实例分析
May 21 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
Symfony2安装第三方Bundles实例详解
Feb 04 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
PDO::prepare讲解
Jan 29 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
微信公众平台天气预报功能开发
2014/07/06 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
javascript OFFICE控件测试代码
2009/12/08 Javascript
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
ExtJs的Date格式字符代码
2010/12/30 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
2013/04/21 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
2014/07/17 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
python中xrange和range的区别
2014/05/13 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
python生成带有表格的图片实例
2019/02/03 Python
Python使用贪婪算法解决问题
2019/10/22 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
python opencv实现简易画图板
2020/08/27 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
英国Lookfantastic中文网站:护肤品美妆美发购物(英国直邮)
2020/04/27 全球购物
学生实习自我鉴定
2013/10/11 职场文书
商务主管岗位职责
2013/12/08 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
项目投资建议书
2014/05/16 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
网站出售协议书范文
2014/10/10 职场文书
借条格式范本
2015/05/25 职场文书