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调用Java对象的方法
Oct 09 PHP
php visitFile()遍历指定文件夹函数
Aug 21 PHP
几款免费开源的不用数据库的php的cms
Dec 19 PHP
PHP采集腾讯微博的实现代码
Jan 19 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
Jun 25 PHP
PHP中new static() 和 new self() 的区别介绍
Jan 09 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
PHP支付系统设计与典型案例分享
Aug 02 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP7扩展开发之hello word实现方法详解
Jan 15 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 PHP
PHP扩展mcrypt实现的AES加密功能示例
Jan 29 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提示Failed to write session data错误的解决方法
2014/12/17 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
script不刷新页面的联动前后代码
2013/09/18 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
浅谈在koa2中实现页面渲染的全局数据
2017/10/09 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
利用Python实现图书超期提醒
2016/08/02 Python
Python编写一个闹钟功能
2017/07/11 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
Python定时器线程池原理详解
2020/02/26 Python
在家更换处方镜片:Lensabl
2019/05/01 全球购物
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
班主任新年寄语
2014/04/04 职场文书
测控技术自荐信
2014/06/05 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python
python三子棋游戏
2022/05/04 Python