php设计模式之代理模式分析【星际争霸游戏案例】


Posted in PHP onMarch 23, 2020

本文实例讲述了php设计模式之代理模式。分享给大家供大家参考,具体如下:

星际争霸如果是多人对战模式,就会遇到一个问题:如何降低网络延时和负担。

为了确保数据的一致性,我们应该将每个玩家的发生变化的数据不停的传送到开地图的主机进行保存,一旦任何某个玩家的客户机读取数据,就必须向主机请求数据。

尽管大多数数据是交互性的,即使某个玩家的人口也是这样的,如果某个敌人的部队杀死了这个玩家的一个部队,立即影响了他的人口数量。

不过水晶矿和气矿有所不同,除了玩家自己的建造操作和农民采集,别的玩家影响不了这个数据。

所以我们考虑在客户机也放一个数据存储,玩家改变或者读取他的资源的时候,先操作本机数据,再通知主机。

代理(Proxy)模式示例:

为了方便,假设客户机已经通过远程包含或其他方法获取了主机上的php代码,它的代码如下:

<?php
  //客户机和主机操作数据时共同要实现的借口
  interface iDataProcess
  {
    //获取数据的方法,$ID表示玩家的ID,$dataName表示获取的数据的名称
    public function getData($ID, $dataName);

    //改变数据的方法,$ID表示玩家的ID,$dataName表示要改变的数据的名称,$dataValue表示改变后的数据的值
    public function updateData($ID, $dataName, $dataValue);
  }

  //主机操作数据的类
  class DataProcess implements iDataProcess
  {
    // 获取数据的方法,$ID表示玩家的ID,$dataName表示获取的数据的名称
    public function getData($ID, $dataName)
    {
      //操作数据库之类的代码
    }

    //改变数据的方法,$ID表示玩家的ID,$dataName表示要改变的数据的名称,$dataValue表示改变后的数据的值
    public function updateData($ID, $dataName, $dataValue)
    {
      //操作数据库之类的代码
    }
  }

  //客户机操作数据的类,也就是代理类
  class ProxyDataProcess implements iDataProcess
  {
  //主机操作数据的对象
    private $dataProcess;

    //构造函数
    public function __construct()
    {
      $this->dataProcess = new DataProcess();
    }

    // 获取数据的方法,$ID表示玩家的ID,$dataName表示获取的数据的名称
    public function getData($ID, $dataName)
    {
      //判断是否直接向主机请求
      switch ($dataName)
      {
        //如果查询水晶矿
        case 'ore':
          //直接从客户机保存的数据读取,详细代码略过
          break;
        //如果查询气矿
        case 'gas':
          //直接从客户机保存的数据读取,详细代码略过
          break;
        default:
          $this->dataProcess->getData($ID, $dataName);
          break;
      }
    }

    //改变数据的方法,$ID表示玩家的ID,$dataName表示要改变的数据的名称,$dataValue表示改变后的数据的值
    public function updateData($ID, $dataName, $dataValue)
    {
      //和读取的思路类似,如果是水晶矿或气矿,就先写入客户机的数据存储,再告诉主机修改
    }
  }

  //新建一个客户机处理数据的对象
  $proxyDataProcess = new ProxyDataProcess();

  //假如显示本玩家自己的气矿剩余数量
  $proxyDataProcess->getData(3, 'gas');
?>

用途总结:代理模式可以将让客户操作一个代理的类,进行一些降低资源消耗的工作,也可以完成比如权限验证的工作。

实现总结:需要一个接口来规定实际和代理操作类都必须实现的方法,比如上面iDataProcess,另外就是实际处理的类,比如上面DataProcess,以及让客户使用的代理操作类,比如上面的ProxyDataProcess。其实代理模式可以有多种用法,这里限于篇幅,只讨论了降低数据操作的负荷。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php5.2时间相差8小时
Jan 15 PHP
获得Google PR值的PHP代码
Jan 28 PHP
PHP操作文件方法问答
Mar 16 PHP
PHP 显示客户端IP与服务器IP的代码
Oct 12 PHP
PHP中对于浮点型的数据需要用不同的方法解决
Mar 11 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 PHP
PHP实现的下载远程图片自定义函数分享
Jan 28 PHP
php模板引擎技术简单实现
Mar 15 PHP
基于PHP后台的Android新闻浏览客户端
May 23 PHP
php实现表单提交上传文件功能
May 28 PHP
PDO::rollBack讲解
Jan 29 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
Jun 08 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 #PHP
PDO实现学生管理系统
Mar 21 #PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 #PHP
YII2框架使用控制台命令的方法分析
Mar 18 #PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 #PHP
YII2框架中日志的配置与使用方法实例分析
Mar 18 #PHP
You might like
Sony CFR 320 修复改造
2020/03/14 无线电
PHP5 安装方法
2007/01/15 PHP
PHP 金额数字转换成英文
2010/05/06 PHP
PHP 写文本日志实现代码
2010/05/18 PHP
基于python发送邮件的乱码问题的解决办法
2013/04/25 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
javascript下过滤数组重复值的代码
2007/09/10 Javascript
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
[46:57]EG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
Linux下编译安装MySQL-Python教程
2015/02/02 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
Django-imagekit的使用详解
2020/07/06 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
转让协议书范本
2014/04/15 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
现役军人家属慰问信
2015/03/24 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
python 如何在 Matplotlib 中绘制垂直线
2021/04/02 Python
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS