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 相关文章推荐
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
PHP-MySQL教程归纳总结
Jun 07 PHP
php 引用(&amp;)详解
Nov 20 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
php面向对象中的魔术方法中文说明
Mar 04 PHP
PHP动态规划解决0-1背包问题实例分析
Mar 23 PHP
php生成圆角图片的方法
Apr 07 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
Jul 20 PHP
php实现将二维关联数组转换成字符串的方法详解
Jul 31 PHP
php中通用的excel导出方法实例
Dec 30 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处理excel cvs表格的方法实例介绍
2013/05/13 PHP
php生成随机数的三种方法
2014/09/10 PHP
PHP里的单例类写法实例
2015/06/25 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
2016/10/20 PHP
如何使用Javascript正则表达式来格式化XML内容
2013/07/04 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
vue中appear的用法
2017/08/17 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
Python中turtle作图示例
2017/11/15 Python
Django admin美化插件suit使用示例
2017/12/12 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
Django开发中复选框用法示例
2018/03/20 Python
python装饰器深入学习
2018/04/06 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
小学生期末自我鉴定
2014/01/19 职场文书
司马光教学反思
2014/02/01 职场文书
大学军训感言400字
2014/03/11 职场文书
环保倡议书50字
2014/05/15 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL