設計模式培訓之五:代理模式
查看本人文章索引請通過http://www.rzrgm.cn/seesea125/archive/2012/04/17/2453256.html
一、 什么是代理模式?
代理模式,為其他對象提供一種代理以控制對這個對像的訪問。
代理模式結構圖:
1. 遠程代理,也就是為一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在不兩只的地址空間的事實。(他所使用到的例子。Webservice在.net 中的應用,當我應用程序的項目中加入一個Web引用,引用一個WebService,此時會在項目中生成一個Webreference的文件夾和一些文件,其實它們就是代理,這就使得客戶端程序調用代理就可以解決遠程訪問的問題。)
2. 虛擬代理,是根據需要創建開銷很大的對象。通過它來存放實例化需要很長時間的真實對象。(例子,比如說你打一個很大的Html網頁時,里面可能有很多的文字和圖片,但你還是可以很快打開它,些時你所看到的是所有文字,但圖片卻是一張一張地下載后才能看到。那些未打開的圖片框,就是通過虛擬代理來替代了真實的圖片,此時代理存儲了真實圖片的路徑和尺寸。)
3. 安全代理,用來控件真實對象訪問時的權限。(例子 不同的訪問權限的時候。)
4. 智能指引,是指當調用真實的對象時,代理處理另外一些事。(例子:如計算真實對旬的引用次數,這樣當該對象沒有引用時,可以自動釋放它ak當第一次引用一個持久對象時,將它裝入內存或在訪問一個實際對象前,檢查是否已經鎖定它,以確保其他對象不能改變它。它們都是通過代理在訪問一個對象時附加一些內務處理。)
三、 下面寫一段實現代理模式的代碼.
經過上面的實戰,我們來思考一下
abstract class subject { public abstract void Request(); } class RealSubject:subject { public override void Request() Console.WriteLine("真實的追求者."); } class Proxy:subject { RealSubject realsubject; public override void Request() { if (realsubject == null) { realsubject = new RealSubject(); } realsubject.Request(); } } class Program { static void Main(string[] args) { Proxy pr = new Proxy(); pr.Request(); Console.Read(); } }
四、疑問解答:
1. 為什么用代理模式?
答:客戶端無法直接操作實際對象。么為什么無法直接操作?一種情況是你需要調用的對象在另外一臺機器上,你需要跨越網絡才能 訪問,如果讓你直接coding去調用,你需要處理網絡連接、處理打包、解包等等非常復雜的步驟,所以為了簡化客戶端的處理,我們使用代理模式,在客戶端 建立一個遠程對象的代理,客戶端就象調用本地對象一樣調用該代理,再由代理去跟實際對象聯系,對于客戶端來說可能根本沒有感覺到調用的東西在網絡另外一 端,這實際上就是Web Service的工作原理。另一種情況雖然你所要調用的對象就在本地,但是由于調用非常耗時,你怕影響你正常的操作,所以特意找個代理來處理這種耗時情 況,一個最容易理解的就是Word里面裝了很大一張圖片,在word被打開的時候我們肯定要加載里面的內容一起打開,但是如果等加載完這個大圖片再打開 Word用戶等得可能早已經跳腳了,所以我們可以為這個圖片設置一個代理,讓代理慢慢打開這個圖片而不影響Word本來的打開的功能。
2. 為什么要抽象這個接口呢?
答:其實抽象接口有一個最大的原因就是約束雙方的行為!什么意思呢?其實就是我逼迫Proxy 必須實現某些方法,而這些方法恰恰是對外公開的主要業務方法。當然也可以靠程序員自律,但是多一個約束總歸是好的,至少如果沒有實現指定方法我們可以在編 譯期就發現錯誤,總比執行時才能發現錯誤要好。另外的原因可能都得歸結到使用接口的好處上去了,這里不再贅述,自己去查接口的文章介紹了。
3. 如查實現權限驗證,為何要對該類添加一個代理類?而不是在此類里面直接加上權限判斷呢?
答:在程序設計中有一個類的單一性原則問題,這個原則很簡單,就是每個類的功能盡可能單一。為 什么要單一,因為只有功能單一這個類被改動的可能性才會最小,就拿剛才的例子來說,如果你將權限判斷放在當前類里面,當前這個類就既要負責自己本身業務邏 輯、又要負責權限判斷,那么就有兩個導致該類變化的原因,現在如果權限規則一旦變化,這個類就必需得改,顯然這不是一個好的設計。


浙公網安備 33010602011771號