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 相关文章推荐
一个用于mysql的数据库抽象层函数库
Oct 09 PHP
模仿OSO的论坛(三)
Oct 09 PHP
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
Oct 09 PHP
php 强制下载文件实现代码
Oct 28 PHP
PHP中提问频率最高的11个面试题和答案
Sep 02 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
php ajax异步读取rss文档数据
Mar 29 PHP
php 判断过去离现在几年的函数(实例代码)
Nov 15 PHP
PHP获取当前执行php文件名的代码
Mar 02 PHP
php微信开发之关键词回复功能
Jun 13 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
Oct 17 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
dedecms模版制作使用方法
2007/04/03 PHP
测试php函数的方法
2013/11/13 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
php获取远程文件大小
2015/10/20 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
JavaScript多线程的实现方法
2007/05/08 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
Python Json数据文件操作原理解析
2020/05/09 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
长安大学毕业生自我鉴定
2014/01/17 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
七个非常实用的Python工具包总结
2021/06/15 Python
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL
7个关于Python的经典基础案例
2021/11/07 Python
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏