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_Flame(Version:Progress)的原代码
Oct 09 PHP
PHP面向对象的使用教程 简单数据库连接
Nov 25 PHP
php,ajax实现分页
Mar 27 PHP
PHP中如何判断AJAX提交的数据
Feb 05 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
PHP数组去重比较快的实现方式
Jan 19 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
php封装单文件上传到数据库(路径)
Oct 15 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 PHP
PDO::exec讲解
Jan 28 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
TP5框架页面跳转样式操作示例
Apr 05 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+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
PHP创建对象的六种方式实例总结
2019/06/27 PHP
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
用python读写excel的方法
2014/11/18 Python
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
python根据url地址下载小文件的实例
2018/12/18 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
2020/07/13 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
vue+django实现下载文件的示例
2021/03/24 Vue.js
大学生毕业的自我鉴定
2013/11/13 职场文书
大课间活动制度
2014/01/18 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
水电站项目建议书
2014/05/12 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers