聲明:本系列博客參考資料《大話設計模式》,作者程傑。
代理模式為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
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面向對象設計模式