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制作静态网站的模板框架
Oct 09 PHP
PHP的栏目导航程序
Oct 09 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
Jun 29 PHP
浅析php单例模式
Nov 25 PHP
Laravel5中contracts详解
Mar 02 PHP
php实现简单的上传进度条
Nov 17 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 PHP
关于php中的json_encode()和json_decode()函数的一些说明
Nov 20 PHP
Laravel下生成验证码的类
Nov 15 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
Jan 17 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
May 06 PHP
PHP实现简易图形计算器
Aug 28 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+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
php封装一个异常的处理类
2017/06/08 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
javascript 使td内容不换行不撑开
2012/11/29 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
python与php实现分割文件代码
2017/03/06 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
在Pycharm中设置默认自动换行的方法
2019/01/16 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
python障碍式期权定价公式
2019/07/19 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
HTML5实现预览本地图片
2016/02/17 HTML / CSS
毕业自我鉴定范文
2013/11/06 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
开业典礼主持词
2014/03/21 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
幼儿园辞职信
2015/05/13 职场文书
pandas数值排序的实现实例
2021/07/25 Python