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 中的面向对象编程:通向大型 PHP 工程的办法
Dec 03 PHP
PHP 作用域解析运算符(::)
Jul 27 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
php实现的九九乘法口诀表简洁版
Jul 28 PHP
php+mysql结合Ajax实现点赞功能完整实例
Jan 30 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
Oct 08 PHP
php 截取utf-8格式的字符串实例代码
Oct 30 PHP
PHP PDOStatement::bindColumn讲解
Jan 30 PHP
PHP实现通过文本文件统计页面访问量功能示例
Feb 13 PHP
对laravel in 查询的使用方法详解
Oct 09 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
May 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
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
网页自动跳转代码收集
2009/09/27 Javascript
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
详解如何利用Cython为Python代码加速
2018/01/27 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
深入了解Django中间件及其方法
2019/07/26 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
pandas DataFrame运算的实现
2020/06/14 Python
python中实现词云图的示例
2020/12/19 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
网站域名和主机:Domain.com
2019/04/01 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
初中物理教学反思
2014/01/14 职场文书
年度考核自我鉴定
2014/03/19 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
感谢信模板大全
2015/01/23 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
二手手机买卖合同范本(2019年版)
2019/10/28 职场文书
导游词之永泰公主墓
2019/12/04 职场文书