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 相关文章推荐
模仿OSO的论坛(一)
Oct 09 PHP
利用discuz实现PHP大文件上传应用实例代码
Nov 14 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
深入PHP变量存储的详解
Jun 13 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
Jun 13 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
php将session放入memcached的设置方法
Feb 14 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
Sep 24 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
mysql desc(DESCRIBE)命令实例讲解
Sep 24 PHP
Yii核心验证器api详解
Nov 23 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
php Calender(日历)代码分享
2014/01/03 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
js特效,页面下雪的小例子
2013/06/17 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
Vue 单文件中的数据传递示例
2017/03/21 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
2018/02/08 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
javascript实现日历效果
2019/06/17 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
更改Python命令行交互提示符的方法
2015/01/14 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
python使用递归的方式建立二叉树
2019/07/03 Python
python conda操作方法
2019/09/11 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
C#面试题
2016/05/06 面试题
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
2015年行政工作总结范文
2015/04/09 职场文书
开会通知短信大全
2015/04/20 职场文书
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs
JAVA springCloud项目搭建流程
2022/05/11 Java/Android
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python