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 相关文章推荐
提问的智慧(2)
Oct 09 PHP
第三节--定义一个类
Nov 16 PHP
PHP 文件上传功能实现代码
Jun 24 PHP
微盾PHP脚本加密专家php解密算法
Sep 13 PHP
php的慢速日志引起的Mysql错误问题分析
May 13 PHP
在Mac上编译安装PHP7的开发环境
Jul 28 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 PHP
PHP+iframe图片上传实现即时刷新效果
Nov 18 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
Jul 09 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
PHP simplexml_load_string()函数实例讲解
Feb 03 PHP
PHP实现统计代码行数小工具
Sep 19 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中的登陆login
2007/01/18 PHP
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
Python version 2.7 required, which was not found in the registry
2014/08/26 Python
Pytorch反向求导更新网络参数的方法
2019/08/17 Python
python读取mysql数据绘制条形图
2020/03/25 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
html5实现多图片预览上传及点击可拖拽控件
2018/03/15 HTML / CSS
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
SHEIN美国:购买时髦的女性服装
2020/12/02 全球购物
Java软件工程师综合面试题笔试题
2013/09/08 面试题
质量月活动策划方案
2014/03/10 职场文书
安全协议书范本
2014/04/21 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
写给导师的自荐信
2015/03/06 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
2015年班主任个人工作总结
2015/03/31 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android