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+dbfile开发小型留言本
Oct 09 PHP
PHP - Html Transfer Code
Oct 09 PHP
php 处理上百万条的数据库如何提高处理查询速度
Feb 08 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
Mar 13 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
Dec 16 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
PHP自动识别字符集并完成转码详解
Aug 02 PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 PHP
PHP 数组黑名单/白名单实例代码详解
Jun 04 PHP
利用ajax+php实现商品价格计算
Mar 31 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
使用php4加速网络传输
2006/10/09 PHP
实用函数5
2007/11/08 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
详解PHP归并排序的实现
2016/10/18 PHP
基于php编程规范(详解)
2017/08/17 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
2018/11/30 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
关于在mongoose中填充外键的方法详解
2017/08/14 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
Python抓取电影天堂电影信息的代码
2016/04/07 Python
Python格式化输出%s和%d
2018/05/07 Python
浅谈python之新式类
2018/08/12 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
pandas分区间,算频率的实例
2019/07/04 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
Python实现EM算法实例代码
2020/10/04 Python
python实现计算图形面积
2021/02/22 Python
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
常用的Python代码调试工具总结
2021/06/23 Python
使用Redis实现实时排行榜功能
2021/07/02 Redis