大話設計模式之代理模式

一、基本概念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);
    }
View Code

(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;
        }
    }
View Code

(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);
        }
    }
View Code

(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();

        }
    }
View Code

三、總結

代理模式(Proxy)根據種類不一樣,效果也不盡相同:

  • 遠程(Remote)代理:爲一個位於不一樣的地址空間的對象提供一個局域表明對象。這個不一樣的地址空間能夠是在本機器中,也但是在另外一臺機器中。遠程代理又叫作大使(Ambassador)。好處是系統能夠將網絡的細節隱藏起來,使得客戶端沒必要考慮網絡的存在。客戶徹底能夠認爲被代理的對象是局域的而不是遠程的,而代理對象承擔了大部份的網絡通信工做。因爲客戶可能沒有意識到會啓動一個耗費時間的遠程調用,所以客戶沒有必要的思想準備。
  • 虛擬(Virtual)代理(圖片延遲加載的例子):根據須要建立一個資源消耗較大的對象,使得此對象只在須要時纔會被真正建立。使用虛擬代理模式的好處就是代理對象能夠在必要的時候纔將被代理的對象加載;代理能夠對加載的過程加以必要的優化。當一個模塊的加載十分耗費資源的狀況下,虛擬代理的好處就很是明顯。
  • Copy-on-Write代理:虛擬代理的一種。把複製(克隆)拖延到只有在客戶端須要時,才真正採起行動。
  • 智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操做,好比將對此對象調用的次數記錄下來等。

 

     代理模式(Proxy)VS 裝飾者(Decorator)

     意圖:它們都提供間接訪問對象層,都保存被調用對象的引用。

     代理模式(Proxy):爲另外一個對象提供一個替身或佔位符以控制對這個對象的訪問,簡而言之就是用一個對象來表明另外一個對象。

    裝飾者(Decorator):動態地給一個對象添加一些額外的職責,就增長功能來講,Decorator模式比生成子類更爲靈活,它避免了類爆炸問題,像裝飾者(Decorator),代理模式(Proxy)組成一個對象並提供相同的接口,但代理模式並不關心對象動態職能的增減。

    在代理模式(Proxy)中Subject定義了主要的功能,並且Proxy根據Subject提供功能控制對象的訪問權限。在裝飾者(Decorator)中Component只是提供了其中的一些功能,須要經過裝飾鏈動態給對象增長職能。

相關文章
相關標籤/搜索