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 sprintf()函数让你的sql操作更安全
Jul 23 PHP
php session安全问题分析
Jun 24 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
PHP回溯法解决0-1背包问题实例分析
Mar 23 PHP
php使用Imagick生成图片的方法
Jul 31 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
PHP浮点数的一个常见问题
Mar 10 PHP
PHP制作登录异常ip检测功能的实例代码
Nov 16 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
Laravel框架实现的批量删除功能示例
Jan 16 PHP
PHP数组array类常见操作示例
May 15 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 获取客户端的真实ip
2009/11/30 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
php多文件上传下载示例分享
2014/02/20 PHP
php限制ip地址范围的方法
2015/03/31 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
wordpress之js库集合研究介绍
2007/08/17 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
JavaScript组合拼接字符串的效率对比测试
2014/11/06 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
Python中几个比较常见的名词解释
2015/07/04 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
用python生成1000个txt文件的方法
2018/10/25 Python
Python匿名函数及应用示例
2019/04/09 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
python怎么自定义捕获错误
2020/06/29 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
函授大学生自我鉴定
2014/02/05 职场文书
《可爱的动物》教学反思
2014/02/22 职场文书
幼儿园见习总结
2015/06/23 职场文书
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫