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 随机记录mysql rand()造成CPU 100%的解决办法
May 18 PHP
str_replace只替换一次字符串的方法
Apr 09 PHP
PHP实现数组递归转义的方法
Aug 28 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
Sep 16 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
PHP翻页跳转功能实现方法
Nov 30 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 PHP
Thinkphp单字母函数使用指南
May 08 PHP
laravel5创建service provider和facade的方法详解
Jul 26 PHP
PHP入门教程之会话控制技巧(cookie与session)
Sep 11 PHP
php实现数组纵向转横向并过滤重复值的方法分析
May 29 PHP
laravel 5.3 单用户登录简单实现方法
Oct 14 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程序中防止盗链
2008/04/09 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
PHP 类与构造函数解析
2017/02/06 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
JS实现alert中显示换行的方法
2015/12/17 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
python 动态加载的实现方法
2017/12/22 Python
python实现list由于numpy array的转换
2018/04/04 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
python版百度语音识别功能
2019/07/09 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
单身旅行者的单身假期:Just You
2018/04/08 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
大专生自荐信
2013/10/04 职场文书
早会主持词
2014/03/17 职场文书
老师对学生的寄语
2014/04/09 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
工作收入证明模板
2015/06/12 职场文书