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 相关文章推荐
实例(Smarty+FCKeditor新闻系统)
Jan 02 PHP
php正则表达式(regar expression)
Sep 10 PHP
用Php编写注册后Email激活验证的实例代码
Mar 11 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
Mar 11 PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
php实现的单一入口应用程序实例分析
Sep 23 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 PHP
php探针使用原理和技巧讲解
Sep 17 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
Oct 22 PHP
Laravel实现批量更新多条数据
Apr 06 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
在项目中寻找代码的坏命名
2012/07/14 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
PHP生成及获取JSON文件的方法
2016/08/23 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
Bootstrap风格的WPF样式
2016/12/07 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
实例Python处理XML文件的方法
2015/08/31 Python
Python序列操作之进阶篇
2016/12/08 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
Django 批量插入数据的实现方法
2020/01/12 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
暇步士官网:Hush Puppies
2016/09/22 全球购物
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
考试诚信承诺书
2014/05/23 职场文书
酒店开业策划方案
2014/06/02 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
施工员岗位职责
2015/02/10 职场文书
简历中自我评价范文
2015/03/11 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers