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学习之PHP运算符
Oct 09 PHP
PHP+MySQL 制作简单的留言本
Nov 02 PHP
php开启安全模式后禁用的函数集合
Jun 26 PHP
PHP获取当前页面URL函数实例
Oct 22 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
Jan 28 PHP
如何在HTML 中嵌入 PHP 代码
May 13 PHP
php将金额数字转化为中文大写
Jul 09 PHP
PHP安装threads多线程扩展基础教程
Nov 17 PHP
PHP目录操作实例总结
Sep 27 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 #PHP
PDO实现学生管理系统
Mar 21 #PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 #PHP
YII2框架使用控制台命令的方法分析
Mar 18 #PHP
You might like
ip签名探针
2006/10/09 PHP
php记录日志的实现代码
2011/08/08 PHP
php中的静态变量的基本用法
2014/03/20 PHP
PHP实现货币换算的方法
2014/11/29 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
2020/01/26 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
关于二级域名下使用一级域名下的COOKIE的问题
2011/11/07 Javascript
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
ExtJS判断IE浏览器类型的方法
2014/02/10 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
Python中的闭包总结
2014/09/18 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
一个C/C++编程面试题
2013/11/10 面试题
新员工入职感言
2014/02/01 职场文书
诚信贷款承诺书
2014/05/30 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
地方白酒代理协议书
2014/10/25 职场文书
redis复制有可能碰到的问题汇总
2022/04/03 Redis