設計模式之代理模式(Proxy)


 

  這段時間一直忙於期末考試,好久沒來博客園了,現在好了,終於考完了,也該過上正常的日子了。開學就是大四的學生了,時間過的可是真快啊,轉眼間大學四年已經接近尾聲了。回想大學這三年,成績還可以吧(年級前10%),參加過各種競賽(acm,數學建模等等),學生會也呆過(打了一年的醬油),好哥們也有那么五六個(希望以后能在一個城市發展,大學期間的寶貴財富啊),另外所謂的大學生創新實踐項目也搞了一個(就算開闊一下視野吧,大學能生有什么創新呢?),經歷也算是有點豐富啦,哈哈,唯一的遺憾可能就是沒交女朋友,還是建議大一,大二的孩子們找個女朋友吧!!好了,說多了,開始進入主題吧。。

1.初識代理模式

  生活中大家一定遇到這樣的情況了:比如說我要買一條毛巾,不妨就是潔麗雅的吧,那一般人的話我應該不是去潔麗雅的工廠里面直接去買吧,而是我們在潔麗雅專賣店或者什么超市啊,這些地方購買,這些地方實際上就是潔麗雅毛巾的代理。這其實和我們OO中的代理模式是很相似的。

  一個it人士,上網應該是經常的事了吧,那么總會有這樣的情況,打開一個網頁,文字先出現,而那些比較大的資源,例如圖片要等等才會顯示出來,這是為什么呢??實際上這其中采用的就是代理模式。

2.代理模式的一個簡單的例子

就說上面的毛巾的例子吧,將有如下類圖:

 

消費者雖然買的是潔麗雅工廠生產的毛巾,確實通過潔麗雅專賣店買到的毛巾,並不是直接去廠家拿貨,這就是代理模式。看看代碼吧:

 1 //定義了接口
 2 interface SaleTowelIntertace
 3 {
 4     void sellTowel();
 5 }
 6 //毛巾的生產類
 7 class TowelProduce : SaleTowelIntertace
 8 {
 9     string ConsumerName;
10     TowelProduce(string consumer_name)
11     {
12         ConsumerName = consumer_name;
13     }
14     void sellTowel()
15     {
16         Console.WriteLine("毛巾賣給了{0}",ConsumerName);
17     }
18 }
19 //賣毛巾的代理類
20 class TowelSaleProxy : SaleTowelIntertace
21 {
22     TowelProduce tp; 
23     TowelSaleProxy(string consumner_name)
24     {
25         tp = new TowelProduce(consumer_name);
26     }
27     void sellTowel()
28     {
29         tp.sellTowel();
30     }
31 }

看了這段代碼,可能會想,那么這個代理有什么用呢?似乎看不到具體有什么好處啊!!其實這樣的主要好處是真正購買毛巾的客戶和廠家並不存在聯系,即減小了他們之間的耦合性。這樣說似乎還是有點抽象了,而這又是一個關鍵的問題。所以……

3.代理模式的意義

  代理模式到底好處在哪里呢??

  那先要說一下代理模式中的三種角色了。

  抽象角色:聲明真實對象和代理對象的共同接口。
  代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。同時,代理對象        可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。
  真實角色:代理角色所代表的真實對象,是我們最終要引用的對象。

  代理模式的一個好處就是對外部提供統一的接口方法,而代理類在接口中實現對真實類的附加操作行為,從而可以在不影響外部調用情況下,進行系統擴展。也就是說,我要修改真實角色的操作的時候,盡量不要修改他,而是在外部在“包”一層進行附加行為,即代理類。例如:接口A有一個接口方法operator(),真實角色:RealA實現接口A,則必須實現接口方法operator()。客戶端Client調用接口A的接方法operator()。現在新需求來了,需要修改RealA中的operator()的操作行為。怎么辦呢?如果修改RealA就會影響原有系統的穩定性,還要重新測試。這是就需要代理類實現附加行為操作。創建代理ProxyA實現接口A,並將真實對象RealA注入進來。ProxyA實現接口方法operator(),另外還可以增加附加行為,然后調用真實對象的operator()。從而達到了“對修改關閉,對擴展開放”,保證了系統的穩定性。我們看客戶端Client調用仍是接口A的接口方法operator(),只不過實例變為了ProxyA類了而已。也就是說代理模式實現了ocp原則。

4.什么時候使用代理模式

  當我們需要使用的對象很復雜或者需要很長時間去構造,這時就可以使用代理模式(Proxy)。例如:如果構建一個對象很耗費時間和計算機資源,代理模式(Proxy)允許我們控制這種情況,直到我們需要使用實際的對象。一個代理(Proxy)通常包含和將要使用的對象同樣的方法,一旦開始使用這個對象,這些方法將通過代理(Proxy)傳遞給實際的對象。 一些可以使用代理模式(Proxy)的情況:

  一個對象,比如一幅很大的圖像,需要載入的時間很長。    

  一個需要很長時間才可以完成的計算結果,並且需要在它計算過程中顯示中間結果

  一個存在於遠程計算機上的對象,需要通過網絡載入這個遠程對象則需要很長時間,特別是在網絡傳輸高峰期。

  一個對象只有有限的訪問權限,代理模式(Proxy)可以驗證用戶的權限

  代理模式(Proxy)也可以被用來區別一個對象實例的請求和實際的訪問,例如:在程序初始化過程中可能建立多個對象,但並不都是馬上使用,代理模式(Proxy)可以載入需要的真正的對象。這是一個需要載入和顯示一幅很大的圖像的程序,當程序啟動時,就必須確定要顯示的圖像,但是實際的圖像只能在完全載入后才可以顯示!這時我們就可以使用代理模式(Proxy)。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM