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&amp;mysql(二)
Oct 09 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 PHP
非常实用的php弹出错误警告函数扩展性强
Jan 17 PHP
phpmailer中文乱码问题的解决方法
Apr 22 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
Apr 23 PHP
Thinkphp中Create方法深入探究
Jun 16 PHP
php+mysql删除指定编号员工信息的方法
Jan 14 PHP
PHP date函数常用时间处理方法
May 11 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 PHP
php实现统计IP数及在线人数的示例代码
Jul 22 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在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
PHP动态变静态原理
2006/11/25 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
jquery实现动态画圆
2014/12/04 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
2015/08/11 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
Python实现的桶排序算法示例
2017/11/29 Python
对python程序内存泄漏调试的记录
2018/06/11 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
什么是python的必选参数
2020/06/21 Python
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
大专自我鉴定范文
2013/10/01 职场文书
微型企业创业投资计划书
2014/01/10 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
女性励志书籍推荐
2019/08/19 职场文书
详解Vue的options
2021/05/15 Vue.js
Python进行区间取值案例讲解
2021/08/02 Python
关于的python五子棋的算法
2022/05/02 Python
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS