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入门速成(2)
Oct 09 PHP
用PHP实现登陆验证码(类似条行码状)
Oct 09 PHP
模仿OSO的论坛(二)
Oct 09 PHP
global.php
Dec 09 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
PHP使用feof()函数读文件的方法
Nov 07 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
php实现CSV文件导入和导出
Oct 24 PHP
Yii数据库缓存实例分析
Mar 29 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
Jun 10 PHP
PHP常用日期加减计算方法实例小结
Jul 31 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 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
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
python如何制作缩略图
2019/04/30 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
python文字转语音实现过程解析
2019/11/12 Python
python 导入数据及作图的实现
2019/12/03 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
高三体育教学反思
2014/01/29 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
美容院合作经营协议书
2014/10/10 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
工程部经理岗位职责
2015/02/02 职场文书
世界红十字日活动总结
2015/02/10 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
2015年酒店销售部工作总结
2015/07/24 职场文书