php设计模式之代理模式分析【星际争霸游戏案例】

 更新时间:2020年03月23日 09:37:38   作者:DavidHHuan  
这篇文章主要介绍了php设计模式之代理模式,结合星际争霸游戏案例形式分析了PHP设计模式中代理模式的相关原理、使用方法与操作注意事项,需要的朋友可以参考下

本文实例讲述了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数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • php支付宝手机网页支付类实例

    php支付宝手机网页支付类实例

    这篇文章主要介绍了php支付宝手机网页支付类实例,是基于Yii框架使用的支付宝接口类文件,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • PHP如何使用Memcached

    PHP如何使用Memcached

    memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。本文给大家介绍PHP如何使用Memcached,感兴趣的朋友一起学习吧
    2016-04-04
  • 使用PHP实现一个轻量级HTML模板引擎

    使用PHP实现一个轻量级HTML模板引擎

    在Web开发中,我们经常需要动态生成HTML页面,为了提高开发效率和代码可维护性,使用模板引擎是一个非常普遍的方案,本文将介绍如何使用PHP实现一个简单的HTML模板引擎,满足变量绑定输出和if判断的需求,需要的朋友可以参考下
    2023-08-08
  • 如何使用微信公众平台开发模式实现多客服

    如何使用微信公众平台开发模式实现多客服

    其实微信公众平台的多客服功能已经出来好久了,并且一出来的时候我就已经为自己的公众号实现了,原本以为大家都已经会了,但是今天还是有人问起这个多客服功能怎么使用,我找了下网上也没什么好的教程,今天我就给大家发一篇比较简单易懂的教程吧
    2016-01-01
  • PHP验证码类ValidateCode解析

    PHP验证码类ValidateCode解析

    这篇文章主要为大家详细解析了PHP验证码类ValidateCode,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Laravel 5框架学习之路由、控制器和视图简介

    Laravel 5框架学习之路由、控制器和视图简介

    这篇文章主要介绍了Laravel 5框架学习之路由、控制器和视图简介,十分的细致全面,需要的朋友可以参考下
    2015-04-04
  • tp5使用layui实现多个图片上传(带附件选择)的方法实例

    tp5使用layui实现多个图片上传(带附件选择)的方法实例

    在以前项目中遇到有上传图片都是用 web Uploader插件上传,因为我现在项目都在使用 layui 所以今天趁着有时间写一个tp5结合layui上传图片的示例,感兴趣的可以了解一下
    2021-10-10
  • Laravel多用户认证系统示例详解

    Laravel多用户认证系统示例详解

    这篇文章主要给大家介绍了关于Laravel多用户认证系统的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • PHP生成推广海报的方法分享

    PHP生成推广海报的方法分享

    本文给大家分享的是如何使用php生成推广海报的方法思路以及几种示例代码,有需要的小伙伴可以参考下
    2018-04-04
  • Laravel中表单size验证数字示例详解

    Laravel中表单size验证数字示例详解

    Laravel 的验证功能非常强大,基本上常见的需求都有对应的验证规则,下面这篇文章主要给大家介绍了关于Laravel中表单size验证数字的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07

最新评论