PHP設計模式——代理模式

聲明:本系列博客參考資料《大話設計模式》,作者程傑。

 

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

 

UML類圖:

 

角色介紹:

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

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

代理對象(Proxy):保存一個引用使得代理可以訪問實體,並提供一個與Follower接口相同的接口,這樣代理可以用來代替實體(Follower)。

 

代碼實現:

 

girlName=$name;
    }

    function giveRose()
    {
        echo "{$this->girlName}:這是我送你的玫瑰,望你能喜歡。
";
    }

    function giveChocolate()
    {
        echo "{$this->girlName}:這是我送你的巧克力,望你能收下。
";
    }
}

/**代理
 * 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();
    }
}

客戶端代碼:

 

 

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代理可以讓這個操作延遲,隻有對象被用到的時候才被克隆。

PHP面向對象設計模式

發佈留言