Proxy代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,主要解決的問題是:在直接訪問對(duì)象時(shí)帶來的問題,比如說:要訪問的對(duì)象在遠(yuǎn)程的機(jī)器上。在面向?qū)ο笙到y(tǒng)中,有些對(duì)象由于某些原因(比如對(duì)象創(chuàng)建開銷很大,或者某些操作需要安全控制,或者需要進(jìn)程外的訪問),直接訪問會(huì)給使用者或者系統(tǒng)結(jié)構(gòu)帶來很多麻煩,我們可以在訪問此對(duì)象時(shí)加上一個(gè)對(duì)此對(duì)象的訪問層。如下圖:
比如說C和A不在一個(gè)服務(wù)器上,A要頻繁的調(diào)用C,我們可以在A上做一個(gè)代理類Proxy,把訪問C的工作交給Proxy,這樣對(duì)于A來說,就好像在直接訪問C的對(duì)象。在對(duì)A的開發(fā)中我們可以把注意力完全放在業(yè)務(wù)的實(shí)現(xiàn)上。
GoF《設(shè)計(jì)模式》中說道:為其他對(duì)象提供一種代理以控制這個(gè)對(duì)象的訪問。
Proxy模式的結(jié)構(gòu):
下面通過一個(gè)場(chǎng)景來看看Proxy的實(shí)現(xiàn),我們要使用代理類型ProxyClass的對(duì)象調(diào)用遠(yuǎn)程機(jī)器上的一個(gè)類型LongDistanceClass的對(duì)象。
首先我們先模擬一個(gè)遠(yuǎn)程的類型:為了保持對(duì)被代理對(duì)象使用的透明性,我們使代理類型和被代理類型同時(shí)繼承同一個(gè)接口IProxy
接口實(shí)現(xiàn):
interface IProxy
{
string Function1();
string Function2();
}
遠(yuǎn)程對(duì)象實(shí)現(xiàn):
/// <summary>
/// 模擬的遠(yuǎn)程對(duì)象
/// </summary>
public class LongDistanceClass:IProxy
{
#region IProxy 成員
public string Function1()
{
//do someting
return "LongDistanceClass.Function1";
}
public string Function2()
{
//do someting
return "LongDistanceClass.Function2";
}
#endregion
}
接下來就要實(shí)現(xiàn)代理類型,使用代理對(duì)象訪問模擬的遠(yuǎn)程對(duì)象,代理類型實(shí)現(xiàn)如下:
public class ProxyClass:IProxy
{
#region IProxy 成員
public string Function1()
{
//to access LongDistanceClass.Function1
LongDistanceClass obj = new LongDistanceClass();
return obj.Function1();
}
public string Function2()
{
//to access LongDistanceClass.Function2
LongDistanceClass obj = new LongDistanceClass();
return obj.Function2();
}
#endregion
}
最后實(shí)現(xiàn)客戶端代碼:
class Class1
{
[STAThread]
static void Main(string[] args)
{
IProxy pro = new ProxyClass();
Console.WriteLine(pro.Function1());
Console.WriteLine(pro.Function2());
Console.Read();
}
}
運(yùn)行結(jié)果如下:
LongDistanceClass.Function1
LongDistanceClass.Function2
Proxy模式的要點(diǎn):
1、“增加一層間接層”是軟件系統(tǒng)中對(duì)許多負(fù)責(zé)問題的一種常見解決方法。在面向?qū)ο笙到y(tǒng)中,直接使用某些對(duì)象會(huì)帶來很多問題,作為間接層的proxy對(duì)象便是解決這一問題的常用手段。
在我們?nèi)粘5墓ぷ髦幸渤3S玫酱砟J剑热鐚?duì)于三層結(jié)構(gòu)或者N- tiers結(jié)構(gòu)中DAL數(shù)據(jù)訪問層,它把對(duì)數(shù)據(jù)庫(kù)的訪問進(jìn)行封裝。BLL業(yè)務(wù)層的開發(fā)者只是調(diào)用DAL中的方法來獲得數(shù)據(jù)。
在比如前一段時(shí)間看了看AOP和Remoting方面的資料,對(duì)于跨越應(yīng)用程序域的訪問,要為客戶應(yīng)用程序提供一個(gè)TransparentProxy(透明代理),客戶程序?qū)嶋H上是通過訪問這個(gè)代理來訪問實(shí)際的類型對(duì)象。
2、具體proxy設(shè)計(jì)模式的實(shí)現(xiàn)方法、實(shí)現(xiàn)粒度都相差很大,有些可能對(duì)單個(gè)對(duì)象作細(xì)粒度的控制,有些可能對(duì)組件模塊提供抽象代理層,在架構(gòu)層次對(duì)對(duì)象作proxy。
3、proxy并不一定要求保持接口的一致性,只要能夠?qū)崿F(xiàn)間接控制,有時(shí)候損及一些透明性是可以接受的。例如上面的那個(gè)例子,代理類型ProxyClass和被代理類型LongDistanceClass可以不用繼承自同一個(gè)接口,正像GoF《設(shè)計(jì)模式》中說的:為其他對(duì)象提供一種代理以控制這個(gè)對(duì)象的訪問。代理類型從某種角度上講也可以起到控制被代理類型的訪問的作用。
posted on 2009-08-04 14:44
xiaoxinchen 閱讀(149)
評(píng)論(0) 編輯 收藏