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 相关文章推荐
用文本作数据处理
Oct 09 PHP
简单的页面缓冲技术
Oct 09 PHP
PHP配置心得包含MYSQL5乱码解决
Nov 20 PHP
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
Mar 10 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
PHP实现数组递归转义的方法
Aug 28 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
php获取当前页面完整URL地址
Dec 30 PHP
PHP开发的微信现金红包功能示例
Jun 29 PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 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
新52大事件
2020/03/03 欧美动漫
mysql 性能的检查和优化方法
2009/06/21 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
2020/09/13 PHP
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
JavaScript优化以及前段开发小技巧
2017/02/02 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
JS实现多选框的操作
2020/06/24 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
粗略分析Python中的内存泄漏
2015/04/23 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
全面分析Python的优点和缺点
2018/02/07 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
python实现logistic分类算法代码
2020/02/28 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
python如何将图片转换素描画
2020/09/08 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
二年级班级文化建设方案
2014/05/10 职场文书
质量承诺书格式
2014/05/20 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
食品安全汇报材料
2014/08/18 职场文书
大学毕业生个人总结
2015/02/28 职场文书
护士求职自荐信范文
2015/03/04 职场文书
年底个人总结范文
2015/03/10 职场文书
golang import自定义包方式
2021/04/29 Golang
Python 中 Shutil 模块详情
2021/11/11 Python