代理模式:為其他對象提供一種代理,并以控制對這個對象的訪問。而對一個對象進行訪問控制的一個原因是為了只有在我們確實需要這個對象時才對它進行創建和初始化。它是給某一個對象提供一個替代者(占位者),使之在client對象和subject對象之間編碼更有效率。代理可以提供延遲實例化,控制訪問, 等等,包括只在調用中傳遞。 一個處理純本地資源的代理有時被稱作虛擬代理。遠程服務的代理常常稱為遠程代理。強制 控制訪問的代理稱為保護代理。
Subject:定義真實主題角色RealSubject 和抽象主題角色Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。代理主題通過持有真實主題RealSubject的引用,不但可以控制真實主題RealSubject的創建或刪除,可以在真實主題RealSubject被調用前進行攔截,或在調用后進行某些操作.
代理角色Proxy:保存一個引用使得代理可以訪問實體。若 RealSubject和Subject的接口相同,Proxy會引用Subject。提供一個與Subject的接口相同的接口,這樣代理就可以用來替代實體。 控制對實體的存取,并可能負責創建和刪除它。 其他功能依賴于代理的類型:Remote Proxy負責對請求及其參數進行編碼,并向不同地址空間中的實體發送已編碼的請求。 Virtual Proxy可以緩存實體的附加信息,以便延遲對它的訪問。Protection Proxy檢查調用者是否具有實現一個請求所必需的訪問權限。
RealSubject:定義了代理角色(proxy)所代表的具體對象.
代理模式的缺點:由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。實現代理模式需要額外的工作,有些代理模式的實現非常復雜。
代理模式在很多情況下都非常有用,特別是你想強行控制一個對象的時候,比如:延遲加載,監視狀態變更的方法等等。
1、“增加一層間接層”是軟件系統中對許多負責問題的一種常見解決方法。在面向對象系統中,直接使用某些對象會帶來很多問題,作為間接層的proxy對象便是解決這一問題的常用手段。
2、具體proxy設計模式的實現方法、實現粒度都相差很大,有些可能對單個對象作細粒度的控制,有些可能對組件模塊提供抽象代理層,在架構層次對對象作proxy。
3、proxy并不一定要求保持接口的一致性,只要能夠實現間接控制,有時候損及一些透明性是可以接受的。