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验证码(支持中文)
Feb 14 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
PHP编码规范之注释和文件结构说明
Jul 09 PHP
php数据库抽象层 PDO
May 07 PHP
PHP与MYSQL中UTF8 中文排序示例代码
Oct 23 PHP
php表单提交实例讲解
Nov 12 PHP
php版微信数据统计接口用法示例
Oct 12 PHP
php实现base64图片上传方式实例代码
Feb 22 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 PHP
php面向对象重点知识分享
Sep 27 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 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中的MVC模式运用技巧
2007/05/03 PHP
PHP 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
Python计算已经过去多少个周末的方法
2015/07/25 Python
用django设置session过期时间的方法解析
2019/08/05 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
keras输出预测值和真实值方式
2020/06/27 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
盛大二次面试题
2016/11/18 面试题
大专应届生个人的自我评价
2013/11/21 职场文书
2014年员工工作总结范文
2014/11/18 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
毕业设计工作总结
2015/08/14 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL
html form表单基础入门案例讲解
2021/07/15 HTML / CSS
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫