???

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