题记
==============================================================================
本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦!

本文地址:http://www.cnblogs.com/davidhhuan/p/4248188.html
==============================================================================

星际争霸如果是多人对战模式,就会遇到一个问题:如何降低网络延时和负担。
为了确保数据的一致性,我们应该将每个玩家的发生变化的数据不停的传送到开地图的主机进行保存,一旦任何某个玩家的客户机读取数据,就必须向主机请求数据。
尽管大多数数据是交互性的,即使某个玩家的人口也是这样的,如果某个敌人的部队杀死了这个玩家的一个部队,立即影响了他的人口数量。
不过水晶矿和气矿有所不同,除了玩家自己的建造操作和农民采集,别的玩家影响不了这个数据。
所以我们考虑在客户机也放一个数据存储,玩家改变或者读取他的资源的时候,先操作本机数据,再通知主机。

代理(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。其实代理模式可以有多种用法,这里限于篇幅,只讨论了降低数据操作的负荷。

相关文章:

1. 星际争霸之php面向对象(一)

2. 星际争霸之php面向对象(二)

3. 星际争霸之php设计模式--简单工厂模式

4. 星际争霸之php设计模式--工厂方法模式

5. 星际争霸之php设计模式--抽象工厂模式

6. 星际争霸之php设计模式--建造器模式

7. 星际争霸之php设计模式--中介者模式

8. 星际争霸之php设计模式--享元模式

9. 星际争霸之php设计模式--代理模式

10. 星际争霸之php设计模式--原型模式

11. 星际争霸之php设计模式--备忘模式

12. 星际争霸之php设计模式--模板模式

13. 星际争霸之php设计模式--正面模式

14. 星际争霸之php设计模式--状态模式

15. 星际争霸之php设计模式--策略模式

16. 星际争霸之php设计模式--组合模式

17. 星际争霸之php设计模式--职责链模式

18. 星际争霸之php设计模式--观察者模式

19. 星际争霸之php设计模式--迭代器模式

20. 星际争霸之php设计模式--适配器模式

9. 星际争霸之php设计模式--代理模式的更多相关文章

  1. 19. 星际争霸之php设计模式--迭代器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. 16. 星际争霸之php设计模式--组合模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. 15. 星际争霸之php设计模式--策略模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. 14. 星际争霸之php设计模式--状态模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  5. 13. 星际争霸之php设计模式--正面模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  6. 12. 星际争霸之php设计模式--模板模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  7. 10. 星际争霸之php设计模式--原型模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  8. 17. 星际争霸之php设计模式--职责链模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  9. 11. 星际争霸之php设计模式--备忘模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

随机推荐

  1. CSS弹性盒布局

    <html> <head> <meta charset="utf-8"/> <title></title> <st ...

  2. shopping cart<代码>

    i = ["iphone 6000", "bicycle 1000", "coffee 50", "python book 100 ...

  3. Surround the Trees---hdu1392(凸包GraHam模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392 题意:有n棵树,每棵树有一个坐标,想用一些绳子把这些树包含起来,求需要绳子的长度: 就是求凸包的 ...

  4. clang: error: no such file or directory: 报错

    clang: error: no such file or directory: '/Users/KuaiYong/Desktop/svn/gamebox_v1.2/SettingViewContro ...

  5. Java学习-026-类名或方法名应用之二 -- 统计分析基础

    前文讲述了类名或方法的应用之一调试源码,具体请参阅:Java学习-025-类名或方法名应用之一 -- 调试源码 此文主要讲述类名或方法应用之二统计分析,通过在各个方法中插桩(调用桩方法),获取方法的调 ...

  6. JMeter学习-006-Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002 解决办法(windows 7)

    好久没用 JMeter 了,今天启动的时候,发现启动命令行窗口出现了警报,警告信息如下图所示:

  7. @SuppressWarnings

    http://www.cnblogs.com/fsjohnhuang/p/4040785.html 一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“ ...

  8. iOS WIFI

    一.公共WIFI综述 现在很多公司都在做免费WIFI,车站.公交.地铁.餐厅,只要是人员密集流动的地方就有WIFI,免费WIFI从最初的网页认证方式也逐渐向客户端认证方式偏移.本文主要讨论iOS认证上 ...

  9. 微信公开课PRO版张小龙演讲全文

    今天,微信当家人张小龙通过微信官方账户发布了一则视频,视频中张小龙阐述了微信对于开放平台的一些理念和方向.张小龙用八点概括.以下是张小龙发言: 各位参加微信公开课的朋友们,大家好. 首先很遗憾这一次不 ...

  10. 英特尔15天开发IDF硬享公社App全过程

    4月8日英特尔智能硬件大赛在上海决赛,4月13日英热尔智能硬件大赛10强在深圳首秀.英特尔辗转两大城市来顾全两地智能硬件创业者,移动直播就成了用户们最重要的观看渠道. 这次英特尔两大会事现场直播都在官 ...