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 相关文章推荐
模拟OICQ的实现思路和核心程序(二)
Oct 09 PHP
超级简单的发送邮件程序
Oct 09 PHP
网站当前的在线人数
Oct 09 PHP
php 动态添加记录
Mar 10 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
Apr 12 PHP
PHP函数之日期时间函数date()使用详解
Sep 09 PHP
Linux下PHP连接Oracle数据库
Aug 20 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
PHP如何将XML转成数组
Apr 04 PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 PHP
PHP实现类似题库抽题效果
Aug 16 PHP
PHP 命名空间和自动加载原理与用法实例分析
Apr 29 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 #PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
PHP中关于php.ini参数优化详解
Feb 28 #PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 #PHP
php 的多进程操作实践案例分析
Feb 28 #PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 #PHP
php的无刷新操作实现方法分析
Feb 28 #PHP
You might like
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
javascript 实用的文字链提示框效果
2010/06/30 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
vue监听scroll的坑的解决方法
2017/09/07 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
JavaScript的级联函数用法简单示例【链式调用】
2019/03/26 Javascript
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
让 python 命令行也可以自动补全
2014/11/30 Python
Python常用算法学习基础教程
2017/04/13 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
Python3多线程基础知识点
2019/02/19 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
this关键字的含义
2015/04/08 面试题
班主任个人工作反思
2014/04/28 职场文书
工作岗位说明书模板
2014/05/09 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android
Windows7下FTP搭建图文教程
2022/08/05 Servers