C#設計模式之代理模式(三)

來源:互聯網
上載者:User
15.4 遠程代理

      遠程代理(Remote Proxy)是一種常用的代理模式,它使得用戶端程式可以訪問在遠程主機上的對象,遠程主機可能具有更好的計算效能與處理速度,可以快速響應並處理用戶端的請求。遠程代理可以將網路的細節隱藏起來,使得用戶端不必考慮網路的存在。用戶端完全可以認為被代理的遠程業務對象是在本地而不是在遠程,而遠程代理對象承擔了大部分的網路通訊工作,並負責對遠程業務方法的調用。

       遠程代理15-5所示,用戶端對象不能直接存取遠程主機中的業務對象,只能採取間接訪問的方式。遠程業務對象在本地主機中有一個代理對象,該代理對象負責對遠程業務對象的訪問和網路通訊,它對於用戶端對象而言是透明的。用戶端無須關心實現具體業務的是誰,只需要按照服務介面所定義的方式直接與本地主機中的代理對象互動即可。

圖15-5 遠程代理

      在基於.NET平台的分布式技術,例如DCOM(Distribute Component Object Model,分散式元件物件模型)、Web Service中,都應用了遠程代理模式,大家可以查閱相關資料進行擴充學習。

 

15.5 虛擬代理

       虛擬代理(Virtual Proxy)也是一種常用的代理模式,對於一些佔用系統資源較多或者載入時間較長的對象,可以給這些對象提供一個虛擬代理。在真實對象建立成功之前虛擬代理扮演真實對象的替身,而當真實對象建立之後,虛擬代理將使用者的請求轉寄給真實對象。

       通常,在以下兩種情況下可以考慮使用虛擬代理:

        (1) 由於對象本身的複雜性或者網路等原因導致一個對象需要較長的載入時間,此時可以用一個載入時間相對較短的代理對象來代表真實對象。通常在實現時可以結合多線程技術,一個線程用於顯示代理對象,其他線程用於載入真實對象。這種虛擬代理模式可以應用在程式啟動的時候,由於建立代理對象在時間和處理複雜度上要少於建立真實對象,因此,在程式啟動時,可以用代理對象代替真實對象初始化,大大加速了系統的啟動時間。當需要使用真實對象時,再通過代理對象來引用,而此時真實對象可能已經成功載入完畢,可以縮短使用者的等待時間。

      (2) 當一個對象的載入十分耗費系統資源的時候,也非常適合使用虛擬代理。虛擬代理可以讓那些佔用大量記憶體或處理起來非常複雜的對象延遲到使用它們的時候才建立,而在此之前用一個相對來說佔用資源較少的代理對象來代表真實對象,再通過代理對象來引用真實對象。為了節省記憶體,在第一次引用真實對象時再建立對象,並且該對象可被多次重用,在以後每次訪問時需要檢測所需對象是否已經被建立,因此在訪問該對象時需要進行存在性檢測,這需要消耗一定的系統時間,但是可以節省記憶體空間,這是一種用時間換取空間的做法。

       無論是以上哪種情況,虛擬代理都是用一個“虛假”的代理對象來代表真實對象,通過代理對象來間接引用真實對象,可以在一定程度上提高系統的效能。

 

15.6 緩衝代理

       緩衝代理(Cache Proxy)也是一種較為常用的代理模式,它為某一個操作的結果提供臨時的緩衝儲存空間,以便在後續使用中能夠共用這些結果,從而可以避免某些方法的重複執行,最佳化系統效能。

       在微軟樣本項目PetShop 4.0的商務邏輯層(Business Logic Layer, BLL)中定義了Product、Category、Item等類,它們封裝了相關的業務方法,用於調用資料訪問層(Data Access Layer, DAL)對象訪問資料庫,以擷取相關資料。為了改進系統效能,PetShop 4.0為這些實現方法增加緩衝機制,引入一個新的對象去控制原來的BLL商務邏輯對象,這些新的對象對應於代理模式中的代理對象。在引入代理模式後,實現了在緩衝層級上對業務對象的封裝,增強了對業務對象的控制,如果需要訪問的資料在緩衝中已經存在,則無須再重複執行擷取資料的方法,直接返回儲存在緩衝中的資料即可。由於原有業務對象(真實對象)和新增代理對象暴露在外的方法是一致的,因而對於調用方即用戶端而言,調用代理對象與真實對象並沒有實質的區別。

       這些新引入的代理類包括ProductDataProxy、CategoryDataProxy和ItemDataProxy等。下面以PetShop.BLL.Product業務對象為例進行說明,PetShop 4.0為其建立了代理對象ProductDataProxy,並在ProductDataProxy的GetProductsByCategory()方法中調用了商務邏輯層Product類的GetProductsByCategory()方法,同時增加了緩衝機制。15-6所示:

圖15-6 PetShop4.0緩衝代理

       在ProductDataProxy類中存在如下程式碼片段:

public static class ProductDataProxy{    private static readonly int productTimeout = int.Parse(ConfigurationManager.AppSettings ["ProductCacheDuration"]);    private static readonly bool enableCaching = bool.Parse(ConfigurationManager. AppSettings["EnableCaching"]);     public static IList GetProductsByCategory(string category)    {                Product product = new Product();        //如果緩衝被禁用,則直接通過product對象來擷取資料         if (!enableCaching)        {            return product.GetProductsByCategory(category);        }        string key = "product_by_category_" + category;        //從緩衝中擷取資料         IList data = (IList )HttpRuntime.Cache[key];          //如果緩衝中沒有資料則執行如下代碼          if (data == null)        {                      data = product.GetProductsByCategory(category);                      //通過工廠建立AggregateCacheDependency對象            AggregateCacheDependency cd = DependencyFacade.GetProductDependency ();           //將資料存放區在緩衝中,並添加必要的AggregateCacheDependency對象            HttpRuntime.Cache.Add(key, data, cd, DateTime.Now.AddHours(product Timeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);         }        return data;    }        ……}

       在上述代碼中,AggregateCacheDependency是從.NET Framework 2.0開始新增的一個類,它負責監視依賴項對象的集合。當這個集合中的任意一個依賴項對象發生改變時,該依賴項對象對應的緩衝對象都將被自動移除。在此不對AggregateCacheDependency進行詳細說明,大家可以查閱相關資料進行擴充學習。

       與商務邏輯層Product對象的GetProductsByCategory()方法相比,上述代碼增加了緩衝機制。當緩衝內不存在相關資料項目時,則直接調用商務邏輯層Product的GetProductsByCategory()方法來擷取資料,並將其與對應的AggregateCacheDependency對象一起儲存在緩衝中。在ProductDataProxy類的每一個業務方法中都執行個體化了Product類,再調用Product類的相應方法,因此ProductDataProxy與Product之間屬於依賴關係,這是標準代理模式的一種變形,可以按照標準代理模式對其進行改進,包括引入高層的抽象介面。

【作者:劉偉(Sunny)  http://blog.csdn.net/lovelion】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.