1. 程式人生 > 程式設計 >php設計模式之代理模式分析【星際爭霸遊戲案例】

php設計模式之代理模式分析【星際爭霸遊戲案例】

本文例項講述了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,$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,$dataValue)
    {
      //和讀取的思路類似,如果是水晶礦或氣礦,就先寫入客戶機的資料儲存,再告訴主機修改
    }
  }

  //新建一個客戶機處理資料的物件
  $proxyDataProcess = new ProxyDataProcess();

  //假如顯示本玩家自己的氣礦剩餘數量
  $proxyDataProcess->getData(3,'gas');
?>

用途總結:代理模式可以將讓客戶操作一個代理的類,進行一些降低資源消耗的工作,也可以完成比如許可權驗證的工作。

實現總結:需要一個介面來規定實際和代理操作類都必須實現的方法,比如上面iDataProcess,另外就是實際處理的類,比如上面DataProcess,以及讓客戶使用的代理操作類,比如上面的ProxyDataProcess。其實代理模式可以有多種用法,這裡限於篇幅,只討論了降低資料操作的負荷。

更多關於PHP相關內容感興趣的讀者可檢視本站專題:《php面向物件程式設計入門教程》、《PHP陣列(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算子用法總結》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧彙總》

希望本文所述對大家PHP程式設計有所幫助。