1. 程式人生 > >php設計模式之代理模式

php設計模式之代理模式

 代理模式為其他物件提供一種代理以控制對這個物件的訪問。在某些情況下,一個物件不適合或者不能直接引用另一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用。

 角色介紹:    

       抽象主題角色(IGiveGift):定義了Follower和Proxy公用介面,這樣就在任何使用Follower的地方都可以使用Proxy。

       主題角色(Follower):定義了Proxy所代表的真實實體。

       代理物件(Proxy):儲存一個引用使得代理可以訪問實體,並提供一個與Follower介面相同的介面,這樣代理可以用來代替實體(Follower)。

程式碼實現:

<?php  
/** 
 * Created by PhpStorm. 
 * User: LYL 
 * Date: 2015/5/16 
 * Time: 16:33 
 */  
  
/**頂層介面 
 * Interface IGiveGift 
 */  
interface IGiveGift  
{  
    function giveRose();  
    
function giveChocolate(); } /**追求者 * Class Follower */ class Follower implements IGiveGift { private $girlName; function __construct($name='Girl') { $this->girlName=$name; } function giveRose() { echo "{$this->girlName}:這是我送你的玫瑰,望你能喜歡。<br/>"; }
function giveChocolate() { echo "{$this->girlName}:這是我送你的巧克力,望你能收下。<br/>"; } } /**代理 * Class Proxy */ class Proxy implements IGiveGift { private $follower; function __construct($name='Girl') { $this->follower=new Follower($name); } function giveRose() { $this->follower->giveRose(); } function giveChocolate() { $this->follower->giveChocolate(); } }

客戶端:

<?php
header("Content-Type:text/html;charset=utf-8");  
//------------------------代理模式測試程式碼------------------  
require_once "./Proxy/Proxy.php";  
$proxy=new Proxy('范冰冰');  
$proxy->giveRose();  
$proxy->giveChocolate();

優點:   

       1、職責清晰

        真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務,附帶的結果就是程式設計簡潔清晰。

        2、代理物件可以在客戶端和目標物件之間起到中介的作用,這樣起到了中介和保護了目標物件的作用。

        3、高擴充套件性

適用場景:

      1) 遠端代理(Remote  Proxy)為一個位於不同的地址空間的物件提供一個本地的代理物件。

        這個不同的地址空間可以是在同一臺主機中,也可是在另一臺主機中,遠端代理又叫做大使(Ambassador)
      2) 虛擬代理(Virtual Proxy)根據需要建立開銷很大的物件。

         如果需要建立一個資源消耗較大的物件,先建立一個消耗相對較小的物件來表示,真實物件只在需要時才會被真正建立。 
      3) 保護代理(Protection Proxy)控制對原始物件的訪問。

           保護代理用於物件應該有不同的訪問許可權的時候。
      4) 智慧指引(Smart Reference)取代了簡單的指標,它在訪問物件時執行一些附加操作。
      5) Copy-on-Write代理:它是虛擬代理的一種,把複製(克隆)操作延遲到只有在客戶端真正需要時才執行。

一般來說,物件的深克隆是一個開銷較大的操作,Copy-on-Write代理可以讓這個操作延遲,只有物件被用到的時候才被克隆。