一、概述
在軟件開發中,有些對象由於創建成本高、訪問時需要與其它進程交互等原因,直接訪問會造成系統速度慢、復雜度增大等問題。這時可以使用代理模式,給系統增加一層間接層,通過間接層訪問對象,從而達到隱藏系統復雜性、提高系統性能的目的。
二、代理模式的詳細介紹
代理模式為其他對象提供一種代理以控制對這個對象的訪問。其結構圖如下:
Subject定義了RealSubject和Proxy共用的接口,使得在任何使用RealSubject的地方都可以使用Proxy
RealSubject定義了Proxy所代表的實體。
Proxy定義了一個控制RealSubject的代理,供ClIEnt使用。
代理模式按照使用目的可以分為以下幾種:
在上面所有種類的代理模式中,虛擬代理、遠程代理、智能引用代理和保護代理較為常見的代理模式。下面讓我們具體看看代理模式的具體定義。
2.1 定義
代理模式——就是給某一個對象提供一個代理,並由代理對象控制對原對象的引用。在一些情況下,一個客戶不想或者不能直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。例如電腦桌面的快捷方式就是一個代理對象,快捷方式是它所引用的程序的一個代理。
2.2 代理模式實現
看完代理模式的描述之後,下面以一個生活中的例子來解釋下代理模式,在現實生活中,如果有同事出國或者朋友出國的情況下,我們經常會拖這位朋友幫忙帶一些電子產品或化妝品等東西,這個場景中,出國的朋友就是一個代理,他(她)是他(她)朋友的一個代理,由於他朋友不能去國外買東西,他卻可以,所以朋友們都托他幫忙帶一些東西的。下面就以這個場景來實現下代理模式,具體代碼如下:
// 客戶端調用
class
ClIEnt
{
static
void
Main(string[] args)
{
// 創建一個代理對象並發出請求
Person proxy =
new
FrIEnd();
proxy.BuyProduct();
Console.Read();
}
}
// 抽象主題角色
public
abstract
class
Person
{
public
abstract
void
BuyProduct();
}
//真實主題角色
public
class
RealBuyPerson : Person
{
public
override
void
BuyProduct()
{
Console.WriteLine(
"幫我買一個IPhone和一台蘋果電腦"
);
}
}
// 代理角色
public
class
FrIEnd:Person
{
// 引用真實主題實例
RealBuyPerson realSubject;
public
override
void
BuyProduct()
{
Console.WriteLine(
"通過代理類訪問真實實體對象的方法"
);
if
(realSubject ==
null
)
{
realSubject =
new
RealBuyPerson();
}
this
.PreBuyProduct();
// 調用真實主題方法
realSubject.BuyProduct();
this
.PostBuyProduct();
}
// 代理角色執行的一些操作
public
void
PreBuyProduct()
{
// 可能不知一個朋友叫這位朋友帶東西,首先這位出國的朋友要對每一位朋友要帶的東西列一個清單等
Console.WriteLine(
"我怕弄糊塗了,需要列一張清單,張三:要帶相機,李四:要帶Iphone..........."
);
}
// 買完東西之後,代理角色需要針對每位朋友需要的對買來的東西進行分類
public
void
PostBuyProduct()
{
Console.WriteLine(
"終於買完了,現在要對東西分一下,相機是張三的;Iphone是李四的.........."
);
}
}
在上面的代碼中都有相應的注釋,這裡也不多解釋了。
三、代理模式的優缺點
全面分析完代理模式之後,讓我們看看這個模式的優缺點:
優點:
代理模式能夠將調用用於真正被調用的對象隔離,在一定程度上降低了系統的耦合度;
代理對象在客戶端和目標對象之間起到一個中介的作用,這樣可以起到對目標對象的保護。代理對象可以在對目標對象發出請求之前進行一個額外的操作,例如權限檢查等。
缺點:
由於在客戶端和真實主題之間增加了一個代理對象,所以會造成請求的處理速度變慢
實現代理類也需要額外的工作,從而增加了系統的實現復雜度。