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代码(星期六,星期日总和)
Nov 12 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
Feb 16 PHP
PHP XML数据解析代码
May 26 PHP
php strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
PHP中比较时间大小实例
Aug 21 PHP
php通过asort()给关联数组按照值排序的方法
Mar 18 PHP
php实现统计网站在线人数的方法
May 12 PHP
php抽象类用法实例分析
Jul 07 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
基于PHP实现用户注册登录功能
Oct 14 PHP
实例讲解PHP验证邮箱是否合格
Jan 28 PHP
laradock环境docker-compose操作详解
Jul 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出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
浅析JavaScript动画模拟拖拽原理
2016/12/09 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
Node.js进阶之核心模块https入门
2018/05/23 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
2020/07/28 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
python爬虫获取多页天涯帖子
2018/02/23 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
详解Python sys.argv使用方法
2019/05/10 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
python中pow函数用法及功能说明
2020/12/04 Python
python装饰器代码深入讲解
2021/03/01 Python
PHP高级工程师面试问题推荐
2013/01/18 面试题
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
2016/04/03 面试题
外贸业务员岗位职责
2013/11/24 职场文书
单位消防安全制度
2014/01/12 职场文书
太太口服液广告词
2014/03/20 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript
vue实现滑动解锁功能
2022/03/03 Vue.js