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
手把手教你使用DedeCms的采集的图文教程
Mar 11 PHP
PHP技术开发技巧分享
Mar 23 PHP
php 目录遍历、删除 函数的使用介绍
Apr 28 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
利用curl抓取远程页面内容的示例代码
Jul 23 PHP
改写函数实现PHP二维/三维数组转字符串
Sep 13 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
Jun 12 PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 PHP
使用PHPMailer发送邮件实例
Feb 15 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
Jul 27 PHP
mac pecl 安装php7.1扩展教程
Oct 17 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
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
使用正则替换变量
2007/05/05 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
nodeJS微信分享
2017/12/20 NodeJs
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
jupyter notebook清除输出方式
2020/04/10 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
预备党员的自我评价
2014/03/12 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
设备管理实施方案
2014/05/31 职场文书
工作失职检讨书500字
2014/10/17 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python