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检测图片木马多进制编程实践
Apr 11 PHP
PHPMailer邮件发送的实现代码
May 04 PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
php通过文件流方式复制文件的方法
Mar 13 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
php抽象类用法实例分析
Jul 07 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
php简单实现短网址(短链)还原的方法(测试可用)
May 09 PHP
PHP中串行化用法示例
Nov 16 PHP
php获取开始与结束日期之间所有日期的方法
Nov 29 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 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
分享常见的几种页面静态化的方法
2015/01/08 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
详解PHP 7.4 中数组延展操作符语法知识点
2019/07/19 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
理解JavaScript原型链
2016/10/25 Javascript
微信小程序开发实战教程之手势解锁
2016/11/18 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
Python数据类型详解(二)列表
2016/05/08 Python
浅谈python中set使用
2016/06/30 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
Python操作qml对象过程详解
2019/09/26 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
css3的transition属性详解
2014/12/15 HTML / CSS
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
三年大学生活自我鉴定
2014/01/21 职场文书
酒店节能降耗方案
2014/05/08 职场文书