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 相关文章推荐
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
在Nginx上部署ThinkPHP项目教程
Feb 02 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
详解php中 === 的使用
Oct 24 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
Feb 25 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 PHP
PHP实现留言板功能的详细代码
Mar 25 PHP
php批量修改表结构实例
May 24 PHP
PHP读取、解析eml文件及生成网页的方法示例
Sep 04 PHP
PHP内存溢出优化代码详解
Feb 26 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
php 中的str_replace 函数总结
2007/04/27 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
详谈PHP编码转换问题
2015/07/28 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
JSON相关知识汇总
2015/07/03 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
python多线程http下载实现示例
2013/12/30 Python
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
Whistles官网:英国女装品牌
2020/08/14 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
群众路线批评与自我批评
2014/02/06 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
解除施工合同协议书
2014/10/17 职场文书
维稳工作承诺书
2015/01/20 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python