摘要:虛擬代理如果需要?jiǎng)?chuàng)建一個(gè)資源消耗較大的對(duì)象,先創(chuàng)建一個(gè)消耗相對(duì)較小的對(duì)象來表示,真實(shí)對(duì)象只在需要時(shí)才會(huì)被真正創(chuàng)建。虛擬代理通過使用一個(gè)小對(duì)象來代表一個(gè)大對(duì)象,可以減少系統(tǒng)資源的消耗,對(duì)系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度。
概念
代理模式(Proxy Pattern) :一種對(duì)象結(jié)構(gòu)型模式。給某一個(gè)對(duì)象提供一個(gè)代理,并由代理對(duì)象控制對(duì)原對(duì)象的引用。
UML 角色抽象主題角色(Subject):定義了RealSubject和Proxy公用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。
真正主題角色(RealSubject):定義了Proxy所代表的真實(shí)實(shí)體。
代理對(duì)象(Proxy):保存一個(gè)引用使得代理可以訪問實(shí)體,并提供一個(gè)與RealSubject接口相同的接口,這樣代理可以用來代替實(shí)體(RealSubject)。
適用場景根據(jù)代理模式的使用目的,常見的代理模式有以下幾種類型:
遠(yuǎn)程(Remote)代理:為一個(gè)位于不同的地址空間的對(duì)象提供一個(gè)本地 的代理對(duì)象,這個(gè)不同的地址空間可以是在同一臺(tái)主機(jī)中,也可是在 另一臺(tái)主機(jī)中,遠(yuǎn)程代理又叫做大使(Ambassador)。
虛擬(Virtual)代理:如果需要?jiǎng)?chuàng)建一個(gè)資源消耗較大的對(duì)象,先創(chuàng)建一個(gè)消耗相對(duì)較小的對(duì)象來表示,真實(shí)對(duì)象只在需要時(shí)才會(huì)被真正創(chuàng)建。
Copy-on-Write代理:它是虛擬代理的一種,把復(fù)制(克?。┎僮餮舆t 到只有在客戶端真正需要時(shí)才執(zhí)行。一般來說,對(duì)象的深克隆是一個(gè) 開銷較大的操作,Copy-on-Write代理可以讓這個(gè)操作延遲,只有對(duì)象被用到的時(shí)候才被克隆。
保護(hù)(Protect or Access)代理:控制對(duì)一個(gè)對(duì)象的訪問,可以給不同的用戶提供不同級(jí)別的使用權(quán)限。
緩沖(Cache)代理:為某一個(gè)目標(biāo)操作的結(jié)果提供臨時(shí)的存儲(chǔ)空間,以便多個(gè)客戶端可以共享這些結(jié)果。
防火墻(Firewall)代理:保護(hù)目標(biāo)不讓惡意用戶接近。
同步化(Synchronization)代理:使幾個(gè)用戶能夠同時(shí)使用一個(gè)對(duì)象而沒有沖突。
智能引用(Smart Reference)代理:當(dāng)一個(gè)對(duì)象被引用時(shí),提供一些額外的操作,如將此對(duì)象被調(diào)用的次數(shù)記錄下來等。
代碼代碼如下:
_name = $name; } /** * 說話 */ public function say() { echo $this->_name."在說話
"; } /** * 在跑步 */ public function run(){ echo $this->_name."在跑步
"; } } /** * Class Proxy 代理對(duì)象 */ class Proxy implements Subject { // 真實(shí)主題對(duì)象 private $_realSubject = null; /** * Proxy constructor. 構(gòu)造方法,依賴注入方式儲(chǔ)存真實(shí)對(duì)象 * * @param RealSubject|null $realSubject */ public function __construct(RealSubject $realSubject = null) { if (empty($realSubject)) { $this->_realSubject = new RealSubject(); } else { $this->_realSubject = $realSubject; } } /** * 調(diào)用說話方法 */ public function say() { $this->_realSubject->say(); } /** * 調(diào)用跑步方法 */ public function run() { $this->_realSubject->run(); } } /** * Class Client 本地測試 */ class Client { public static function test() { // 創(chuàng)建 $subject = new RealSubject("張三"); // 代理 $proxy = new Proxy($subject); // 張三在說話 $proxy->say(); // 張三在跑步 $proxy->run(); } } // 測試 Client::test();
運(yùn)行結(jié)果:
張三在說話 張三在跑步優(yōu)點(diǎn)和缺點(diǎn) 優(yōu)點(diǎn):
代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度。
遠(yuǎn)程代理使得客戶端可以訪問在遠(yuǎn)程機(jī)器上的對(duì)象,遠(yuǎn)程機(jī)器 可能具有更好的計(jì)算性能與處理速度,可以快速響應(yīng)并處理客戶端請求。
虛擬代理通過使用一個(gè)小對(duì)象來代表一個(gè)大對(duì)象,可以減少系統(tǒng)資源的消耗,對(duì)系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度。
保護(hù)代理可以控制對(duì)真實(shí)對(duì)象的使用權(quán)限。
缺點(diǎn):由于在客戶端和真實(shí)主題之間增加了代理對(duì)象,因此 有些類型的代理模式可能會(huì)造成請求的處理速度變慢。
實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非常復(fù)雜。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/22075.html
摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,能夠在一定程度上降低系統(tǒng)的耦合性。特點(diǎn)低耦合性,獨(dú)立性好,安全性應(yīng)用客戶訪問不到或者被訪問者希望隱藏自己,所以通過代理來訪問自己。 我們接著上面的幾種模式繼續(xù)講: 4、組合模式 將對(duì)象組合成樹形結(jié)構(gòu)表示部分-整體的層次結(jié)構(gòu)。 特點(diǎn):靈活性強(qiáng) 應(yīng)用:對(duì)象的部分-整體的層次結(jié)構(gòu),模糊組合對(duì)象和簡單對(duì)象處理問題 代碼實(shí)現(xiàn) /** 組合模式* *///繼承模式clas...
摘要:分別為適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。設(shè)計(jì)模式五適配器模式適配器模式將某個(gè)對(duì)象的接生成器和協(xié)程的實(shí)現(xiàn)在這篇文章中,作者針對(duì)那些比較難以理解的概念,以一個(gè)更為通俗的方式去講明白。。 PHP 源碼注解 PHP 的詳細(xì)源碼注解 PHP 字符串操作整理 一些有關(guān)字符串的常用操作。 Redis 常見七種使用場景 (PHP 實(shí)戰(zhàn)) 這篇文章主要介紹利用 R...
摘要:而在面試過程中,也是經(jīng)常會(huì)遇到的,所以,無論是面試準(zhǔn)備還是日常開發(fā),我們都應(yīng)該關(guān)注這方面的東西。二分法的基本做法是確定要查找的區(qū)間。區(qū)間內(nèi)選取二分點(diǎn)。根據(jù)二分點(diǎn)的值,綜合左右區(qū)間情況以及求解的目的,舍去一半無用的區(qū)間。 showImg(https://images.pexels.com/photos/935977/pexels-photo-935977.jpeg); 前言 面試是你進(jìn)入...
閱讀 3264·2021-11-23 09:51
閱讀 2537·2021-09-27 13:34
閱讀 2515·2021-09-08 09:45
閱讀 703·2019-08-30 15:44
閱讀 3527·2019-08-29 12:17
閱讀 2792·2019-08-26 12:18
閱讀 2659·2019-08-26 10:10
閱讀 3115·2019-08-23 18:02