設計模式(十三)代理模式(Proxy Pattern)

来源:http://www.cnblogs.com/xiongzaiqiren/archive/2016/03/28/5328749.html
-Advertisement-
Play Games

一、引言 在軟體開發過程中,有些對象有時候會由於網路或其他的障礙,以至於不能夠或者不能直接訪問到這些對象,如果直接訪問對象給系統帶來不必要的複雜性,這時候可以在客戶端和目標對象之間增加一層中間層,讓代理對象代替目標對象,然後客戶端只需要訪問代理對象,由代理對象去幫我們去請求目標對象並返回結果給客戶端 ...


一、引言

  在軟體開發過程中,有些對象有時候會由於網路或其他的障礙,以至於不能夠或者不能直接訪問到這些對象,如果直接訪問對象給系統帶來不必要的複雜性,這時候可以在客戶端和目標對象之間增加一層中間層,讓代理對象代替目標對象,然後客戶端只需要訪問代理對象,由代理對象去幫我們去請求目標對象並返回結果給客戶端,這樣的一個解決思路就是今天要介紹的代理模式。

二、代理模式的詳細介紹

代理模式按照使用目的可以分為以下幾種:

  遠程(Remote)代理:為一個位於不同的地址空間的對象提供一個局域代表對象。這個不同的地址空間可以是本電腦中,也可以在另一臺電腦中。最典型的例子就是——客戶端調用Web服務或WCF服務。
  虛擬(Virtual)代理:根據需要創建一個資源消耗較大的對象,使得對象只在需要時才會被真正創建。
  Copy-on-Write代理:虛擬代理的一種,把複製(或者叫克隆)拖延到只有在客戶端需要時,才真正採取行動。
  保護(Protect or Access)代理:控制一個對象的訪問,可以給不同的用戶提供不同級別的使用許可權。
  防火牆(Firewall)代理:保護目標不讓惡意用戶接近。
  智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,比如將對此對象調用的次數記錄下來等。
  Cache代理:為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以這些結果。
在哦上面所有種類的代理模式中,虛擬代理、遠程代理、智能引用代理和保護代理較為常見的代理模式。下麵讓我們具體看看代理模式的具體定義。

2.1 定義

  代理模式——就是給某一個對象提供一個代理,並由代理對象控制對原對象的引用。在一些情況下,一個客戶不想或者不能直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。例如電腦桌面的快捷方式就是一個代理對象,快捷方式是它所引用的程式的一個代理。

2.2 代理模式實現

  看完代理模式的描述之後,下麵以一個生活中的例子來解釋下代理模式,在現實生活中,如果有同事出國或者朋友出國的情況下,我們經常會拖這位朋友幫忙帶一些電子產品或化妝品等東西,這個場景中,出國的朋友就是一個代理,他(她)是他(她)朋友的一個代理,由於他朋友不能去國外買東西,他卻可以,所以朋友們都托他幫忙帶一些東西的。下麵就以這個場景來實現下代理模式,具體代碼如下:

    // 客戶端調用
    class Client
    {
        static void Main(string[] args)
        {
            // 創建一個代理對象併發出請求
            Person proxy = new Friend();
            proxy.BuyProduct();
            Console.Read();
        }
    }
    // 抽象主題角色
    public abstract class Person
    {
        public abstract void BuyProduct();
    }
    //真實主題角色
    public class RealBuyPerson : Person
    {
        public override void BuyProduct()
        {
            Console.WriteLine("幫我買一個IPhone和一臺蘋果電腦");
        }
    }
    // 代理角色
    public class Friend:Person
    {
        // 引用真實主題實例
        RealBuyPerson realSubject;
        public override void BuyProduct()
        {
            Console.WriteLine("通過代理類訪問真實實體對象的方法");
            if (realSubject == null)
            {
                realSubject = new RealBuyPerson();
            }
            this.PreBuyProduct();
            // 調用真實主題方法
            realSubject.BuyProduct();
            this.PostBuyProduct();
        }
        // 代理角色執行的一些操作
        public void PreBuyProduct()
        {
            // 可能不知一個朋友叫這位朋友帶東西,首先這位出國的朋友要對每一位朋友要帶的東西列一個清單等
            Console.WriteLine("我怕弄糊塗了,需要列一張清單,張三:要帶相機,李四:要帶Iphone...........");
        }
                          
        // 買完東西之後,代理角色需要針對每位朋友需要的對買來的東西進行分類
        public void PostBuyProduct()
        {
            Console.WriteLine("終於買完了,現在要對東西分一下,相機是張三的;Iphone是李四的..........");
        }
    }

在上面的代碼中都有相應的註釋,這裡也不多解釋了。

2.3 代理模式的類圖結構

看完代理模式的實現之後,下麵就以上面的例子來分析下代理模式的類圖結構。具體的類圖如下所示:

在上面類圖中,代理模式所涉及的角色有三個:

  抽象主題角色(Person):聲明瞭真實主題和代理主題的公共介面,這樣一來在使用真實主題的任何地方都可以使用代理主題。

  代理主題角色(Friend):代理主題角色內部含有對真實主題的引用,從而可以操作真實主題對象;代理主題角色負責在需要的時候創建真實主題對象;代理角色通常在將客戶端調用傳遞到真實主題之前或之後,都要執行一些其他的操作,而不是單純地將調用傳遞給真實主題對象。例如這裡的PreBuyProduct和PostBuyProduct方法就是代理主題角色所執行的其他操作。

  真實主題角色(RealBuyPerson):定義了代理角色所代表的真是對象。

附:在實際開發過程中,我們在客戶端添加服務引用的時候,在客戶程式中會添加一些額外的類,在客戶端生成的類扮演著代理主題角色,我們客戶端也是直接調用這些代理角色來訪問遠程服務提供的操作。這個是遠程代理的一個典型例子。

三、代理模式的優缺點


全面分析完代理模式之後,讓我們看看這個模式的優缺點:

優點:

  1,代理模式能夠將調用用於真正被調用的對象隔離,在一定程度上降低了系統的耦合度;
  2,代理對象在客戶端和目標對象之間起到一個中介的作用,這樣可以起到對目標對象的保護。代理對象可以在對目標對象發出請求之前進行一個額外的操作,例如許可權檢查等。

缺點:

  1,由於在客戶端和真實主題之間增加了一個代理對象,所以會造成請求的處理速度變慢
  2,實現代理類也需要額外的工作,從而增加了系統的實現複雜度。


五、總結


  到這裡,代理模式的介紹就結束了,代理模式提供了對目標對象訪問的代理。並且到這裡,結構型模式的介紹也結束了,結構型模式包括:適配器模式、橋接模式、裝飾者模式、組合模式、外觀模式、享元模式和代理模式,下麵開始介紹行為型模式的第一個模式:模板方法模式。

 

以上內容摘抄總結自:http://learninghard.blog.51cto.com/6146675/1315891


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 課程總共包含100個課時,總授課長達27多個小時,內容覆蓋面廣,從入門到精通,授課通俗易懂,分析問題獨到精辟通過本套視頻的學習,學員能夠快速的掌握java編程語言,成為java高手。課程目錄:課時1 01lesson1 Java概述 17:18課時2 02lesson1 Java跨平臺的原理 11: ...
  • 教程簡介 本教程由後盾網講解,共40節,主要介紹了美團網的開發,從需求分析出發,對商鋪的建立、購物流程的構建及訂單處理等都做了詳細的介紹,非常適合做電子商務開發的朋友和同學參考學習使用,完整教程可以在本站下載觀看,同時提供部分章節線上觀看,完整目錄如下: 1.項目介紹,流程分析以及表關係建立2.後臺 ...
  • 後盾網教程統一大集合整理(內容較多,請自備紙巾) 傳送門:http://fu83.cn/thread-162-1-1.html ...
  • 什麼叫架構?揭開架構神秘的面紗,無非就是:分層+模塊化。任意複雜的架構,你也會發現架構師也就做了這兩件事。 本文將會全面的介紹我們團隊在模塊化設計方面取得的經驗。之所以加了“全面”二字,是因為本文的內容將會涉及到:資料庫、路由、C#、JavaScript、CSS、HTML等一個完整模塊所需要的內容。 ...
  • 序言 在.Net的世界中,一提及SOA,大家想到的應該是Web Service,WCF,還有人或許也會在.NET MVC中的Web API上做上標記,然後泛泛其談! 的確,微軟的這些技術也確實推動著面向服務的世界發展,當然除了微軟還有很多面向服務的開源技術,甚至在某些方面比微軟做的更加優秀。那麼什麼 ...
  • 一、前言 面向對象技術可以很好地解決一些靈活性或可擴展性問題,但在很多情況下需要在系統中增加類和對象的個數。當對象數量太多時,將導致運行代價過高,帶來性能下降等問題。 享元模式正是為解決這一類問題而誕生的。享元模式通過共用技術實現相同或相似對象的重用。 在享元模式中通常會出現工廠模式,需要創建一個享 ...
  • * 軟體腐化的原因: 問題所在 設計目標 過於僵硬 可擴展性(新性能可以很容易加入系統)過於脆弱 靈活性(修改不會波及其它)復用率低 粘度過高 可插入性(新功能容易加入系統(氣囊加入方向盤)) * 提高系統可復用性的幾點原則:傳統復用:1. 代碼的粘帖復用2. 演算法的復用3. 數據結構的復用 * 可 ...
  • 一、引言 提到模板,大家肯定不免想到生活中的“簡歷模板”、“論文模板”、“Word中模版文件”等,在現實生活中,模板的概念就是——有一個規定的格式,然後每個人都可以根據自己的需求或情況去更新它,例如簡歷模板,下載下來的簡歷模板的格式都是相同的,然而我們下載下來簡歷模板之後我們可以根據自己的情況填充不 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...