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 相关文章推荐
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 PHP
PHP中的CMS的涵义
Mar 11 PHP
使用TinyButStrong模板引擎来做WEB开发
Mar 16 PHP
PHPMYADMIN导入数据最大为2M的解决方法
Apr 23 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 PHP
PHP PDO fetch 模式各种参数的输出结果一览
Jan 07 PHP
php输出全球各个时区列表的方法
Mar 31 PHP
Symfony2开发之控制器用法实例分析
Feb 05 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
Mar 24 PHP
PHP simplexml_load_string()函数实例讲解
Feb 03 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 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 strcmp使用说明
2010/04/22 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
php数组编码转换示例详解
2014/03/11 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
PHP实现的简单日历类
2014/11/29 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
php xhprof使用实例详解
2019/04/15 PHP
javascript面向对象编程代码
2011/12/19 Javascript
js获取多个tagname的节点数组
2013/09/22 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
10个经典的网页鼠标特效代码
2018/01/09 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
2019/04/19 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
Python 多线程的实例详解
2017/09/07 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
python实现简单图书管理系统
2019/11/22 Python
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
公司业务员岗位职责
2014/03/18 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
违纪检讨书范文
2015/01/27 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS