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 相关文章推荐
第四节 构造函数和析构函数 [4]
Oct 09 PHP
echo, print, printf 和 sprintf 区别
Dec 06 PHP
收集的DedeCMS一些使用经验
Mar 17 PHP
[原创]效率较高的php下读取文本文件的代码
Jul 02 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
May 10 PHP
php图片加中文水印实现代码分享
Oct 31 PHP
PHP判断远程图片是否存在的几种方法
May 04 PHP
PHP处理大量表单字段的便捷方法
Feb 07 PHP
PHP 自动加载的简单实现(推荐)
Aug 12 PHP
CI框架常用函数封装实例
Nov 21 PHP
PHP两种实现无级递归分类的方法
Mar 02 PHP
用PHP的反射实现委托模式的讲解
Mar 22 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基础知识介绍
2013/09/17 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
2014/06/23 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
ajax异步请求详解
2017/01/06 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
loading动画特效小结
2017/01/22 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
Python 解析XML文件
2009/04/15 Python
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
Python常用特殊方法实例总结
2019/03/22 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
环保建议书100字
2014/05/14 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
学习作风建设心得体会
2014/10/22 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
关于python类SortedList详解
2021/09/04 Python