一、基本概念html
隨着互聯網飛速的發展,如今許多軟件系統都提供跨網絡和系統的應用,但在跨網絡和系統應用時,做爲系統開發者並不但願客戶直接訪問系統中的對象。其中緣由不少考慮到系統安全和性能因素,這時候聰明的開發者想到了在客戶端和系統端添加一層中間層----代理層,也是即將要介紹的代理模式程序員
(1)定義安全
代理模式(Proxy)爲另外一個對象提供一個替身或佔位符以控制對這個對象的訪問,簡而言之就是用一個對象來表明另外一個對象服務器
(2)意圖網絡
提供其餘對象一個代理或佔位符,來控制該對象的訪問權限。編輯器
(3)動機ide
爲何咱們要控制對象的訪問權限呢?其中一個緣由是經過控制來延遲對象的建立和實例化,直到真正須要使用該對象才進行建立和實例化。因爲一些對象建立和實例化須要佔用大量系統資源,但咱們並不能肯定用戶必定會調用該對象,因此經過延遲對象實例化來減緩系統資源的消耗。例如文檔編輯器如word,咱們能夠在裏面插入連接、圖片等,可是並非咱們每次打開word時都有建立和實例化這些對象,特別是實例化圖片對象很消耗資源,並且咱們有必要實例化全部圖片嗎?當咱們在查看word時,只是看到其中的一部分,因此沒有必要實例化因此資源,當咱們看下一頁時再實例化也不遲。性能
(4)結構圖優化
二、實例代碼this
軟件系統設計能夠提供本地或遠程的方法,隨着互聯網的發展特別是WebService技術的提出,使得更多軟件系統都提供遠程方法調用。當咱們訪問網絡上一臺計算機的資源時,咱們正在跨越網絡障礙,跨越網絡障礙有時候是很是複雜,由於要確保數據安全可靠地傳輸。若是真的要咱們都去解決那些複雜網絡問題,那麼我估計程序員們瘋了。還好代理模式(Proxy)幫咱們解決了其中的一些問題----WebService技術。
如今讓咱們經過一個簡單的加減乘除程序爲例,說明什麼是代理模式(Proxy)和如何實現。
如今咱們服務器端提供計算方法,分別定義計算類Math和代理類MathProxy。而後咱們的客戶端經過調研MathProxy來間接用Math類的計算方法。
(1)定義加減的接口
public interface IMath { double add(double x, double y); double sub(double x, double y); }
(2)定義加減實體類
public class Math :IMath { public double add(double x,double y) { return x + y; } public double sub(double x,double y) { return x - y; } }
(3)定義加減代理類
public class MathProxy:IMath { private IMath math; public MathProxy(IMath math) { this.math = math; } public double add(double x,double y) { return math.add(x, y); } public double sub(double x,double y) { return math.sub(x, y); } }
(4)客戶端代碼
class Program { static void Main(string[] args) { IMath math = new Math(); MathProxy proxy = new MathProxy(math); double r1=proxy.add(1, 2); double r2 = proxy.sub(5, 6); Console.WriteLine(r1+r2); Console.ReadLine(); } }
三、總結
代理模式(Proxy)根據種類不一樣,效果也不盡相同:
代理模式(Proxy)VS 裝飾者(Decorator)
意圖:它們都提供間接訪問對象層,都保存被調用對象的引用。
代理模式(Proxy):爲另外一個對象提供一個替身或佔位符以控制對這個對象的訪問,簡而言之就是用一個對象來表明另外一個對象。
裝飾者(Decorator):動態地給一個對象添加一些額外的職責,就增長功能來講,Decorator模式比生成子類更爲靈活,它避免了類爆炸問題,像裝飾者(Decorator),代理模式(Proxy)組成一個對象並提供相同的接口,但代理模式並不關心對象動態職能的增減。
在代理模式(Proxy)中Subject定義了主要的功能,並且Proxy根據Subject提供功能控制對象的訪問權限。在裝飾者(Decorator)中Component只是提供了其中的一些功能,須要經過裝飾鏈動態給對象增長職能。