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大批量数据操作时临时调整内存与执行时间的方法
Apr 20 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
May 03 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
PHP实现算式验证码和汉字验证码实例
Mar 09 PHP
typecho插件编写教程(四):插件挂载
May 28 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
php闭包中使用use声明变量的作用域实例分析
Aug 09 PHP
Laravel中的chunk组块结果集处理与注意问题
Aug 15 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 PHP
Yii框架应用组件用法实例分析
May 15 PHP
通过代码实例解析PHP session工作原理
Dec 11 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
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
国外PHP程序员的13个好习惯小结
2012/02/20 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
php中array_fill函数的实例用法
2021/03/02 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
js 通用订单代码
2013/12/23 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
详解Django中类视图使用装饰器的方式
2018/08/12 Python
Python判断telnet通不通的实例
2019/01/26 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
基于Python实现扑克牌面试题
2019/12/11 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
资深地理教师自我评价
2013/09/21 职场文书
表彰先进集体通报
2014/01/12 职场文书
学校出纳员岗位职责
2014/03/18 职场文书
户外拓展训练感想
2015/08/07 职场文书
python状态机transitions库详解
2021/06/02 Python
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python