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 相关文章推荐
php下使用无限生命期Session的方法
Mar 16 PHP
php 图片上传类代码
Jul 17 PHP
php 过滤器实现代码
Aug 09 PHP
php笔记之:php数组相关函数的使用
Apr 26 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
Jun 27 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
Nov 18 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
Nov 19 PHP
PHP开启opcache提升代码性能
Apr 26 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
PHP生成图表pChart的示例解析
Jul 31 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
Php Mssql操作简单封装支持存储过程
2009/12/11 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中正则表达式的用法实例汇总
2014/08/18 Python
Python发送以整个文件夹的内容为附件的邮件的教程
2015/05/06 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
python3中zip()函数使用详解
2018/06/29 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
python调用webservice接口的实现
2019/07/12 Python
python文件操作的简单方法总结
2019/11/07 Python
详解Python中第三方库Faker
2020/09/25 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
本科生求职简历的自我评价
2013/10/21 职场文书
财务会计应届生求职信
2013/11/24 职场文书
运动会通讯稿150字
2014/02/15 职场文书
小学开学典礼主持词
2014/03/19 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
Java无向树分析 实现最小高度树
2022/04/09 Javascript