通俗易懂設計模式解析——代理模式


前言

  今天講的是結構型設計模式中的最后一個,這個模式也就是代理模式,在前段時間我寫的一篇關於正向代理和反向代理的文章。雖說此代理非彼代理。但是代理一詞還是具有相似的含義的。這里我們繼續使用文章中的代購一個例子來講述一下代理模式吧,人不方便去購買哪些物品,這時就有一個中間人,他來購買。他代替我去購買。他也就充當了那個代理的職責。我們繼續往下看吧。

代理模式介紹

一、來由

  在軟件系統的開放中,有一些對象存在,但是直接訪問會給使用者帶來一些麻煩,或者使用起來不那么方便,這是就是需要一個代理對象來中間起到關鍵作用。通過這個代理對象進行訪問,以來解決這些問題。這也就是代理模式。

二、意圖

  為其他對象提供一種代理以控制對這個對象的訪問。

三、案例圖

 

 

 

四、代理模式代碼示例

看上面的案例圖,我們發現代理模式包含以下部分:

抽象角色:定義代理角色和真實角色的公共接口,這樣來說使用真實角色的地方就可以使用代理角色。

代理角色:包含對真實角色的引用,這樣可以操作真實角色,代理角色不僅僅只是調用真實角色,也會執行其他的操作。

真實角色:定義了代理角色所代表的真實角色。

這里我們使用的是一個代理進行代購的案例來進行講述,讓我們一起看看如何實現的吧:

 

namespace Proxy_Pattern { class ProxyPattern { } #region 抽象角色——抽象需要做的事情的方法
    public abstract class Buy { public abstract void BuyFun(string Name); } #endregion

    #region 真實角色——實現抽象的方法
    public class RealBuy : Buy { public override void BuyFun(string Name) { Console.WriteLine($"幫我購買{Name}"); } } #endregion

    #region 代理角色——代購
    public class ProxyBuy : Buy { public RealBuy realBuy; public ProxyBuy() { realBuy = new RealBuy(); } public override void BuyFun(string Name) { var flag= this.AllowBuy(Name); if (!flag) { Console.WriteLine("違禁品不允許購買"); } else { realBuy.BuyFun(Name); Recording(Name); } } /// <summary>
        /// 代理模式中的額外操作。例如購買的東西,不可能啥東西都買。需要對購買的東西進行檢查 /// </summary>
        /// <param name="Name">購買的東西</param>
        /// <returns></returns>
        public bool AllowBuy(string Name) { if (Name!="違禁品") { return true; } return false; } /// <summary>
        /// 對購買的東西進行記錄 /// </summary>
        /// <param name="Name"></param>
        public void Recording(string Name) { Console.WriteLine($"這次代購購買了{Name}"); } } #endregion }

 

namespace Proxy_Pattern { class Program { static void Main(string[] args) { //初始化代理對象
            Buy buy = new ProxyBuy(); //代理對象進行處理事務
            buy.BuyFun("化妝品"); buy.BuyFun("違禁品"); } } }

 

使用場景及優缺點

  不管是使用怎樣的代理,都是在軟件系統中增加一個中間層次,這種方式對於解決一些復雜問題或者對象之間的問題提供了較大方便。代理模式又划分了許多的類型,待會下面我們會一一介紹的。代理模式並不要求保持各個類之間的接口的一致性,代理模式的重點是間接控制,中間層次管理。

一、使用場景

根據代理模式的職責我們可以分為以下的使用場景:
遠程代理:為兩個不同地址的對象信息代理,典型例子就是客戶端與服務之間。客戶端調用服務。

虛擬代理:根據需要創建一個資源消耗較大的對象,使得對象在需要的時候才會被調用。

Copy-on-Write 代理:屬於虛擬代理的一種,把復制或者克隆拖延到客戶端需要的時候才執行。

保護(Protect or Access)代理:控制對象的訪問,提供不同級別使用的不同的訪問權限。

Cache代理:為一個目標的結果提供一個臨時的保存空間,以便於多個客戶端可以使用這些結果

防火牆(Firewall)代理:保護目標不受惡意侵犯

智能引用(Smart Reference)代理:當一個對象被調用引用的時候,提供一些額外的操作,可以把調用的次數或調用的位置記錄下來。

二、優點

1、增加了中間代理層,降低了客戶端與對象之間的耦合度

2、中間的代理對對象增加了保護層次,同時也可以增加一些額外的操作例如權限控制、智能化

3、職責清晰明了。抽象—真實—代理

三、缺點

1、由於增加了代理對象,有些情況可能會造成代理之間的請求變慢

2、由於增加了代理對象,增加了一些額外的工作,造成了系統的復雜度

總結

  到這里設計模式中的結構型的各個設計模式我就介紹完了。最后一個代理模式,理解起來也是相對簡單的。重點理解代理一詞。再回首、看看我們也將看完了設計模式三個部分中的兩個部分。創建型——解決對象創建的問題,對象之間解耦的問題。結構型——主要解決的是類和對象之間的結構問題。這里又包括類結構和對象結構問題。這里我們再來回顧一下結構型設計模式及其重點吧

適配器模式——注重轉換接口,使接口匹配、達到復用的目的

橋接模式——注重接口和實現的分離,注重多維度的變化。

裝飾模式——注重穩定接口的前提下對對象進行擴展

組合模式——注重將一對多轉換為一對一,樹型結構層次的關系

外觀模式——簡化接口和客戶端之間的調用依賴關系

享元模式——注重最小單元對象的共享

代理模式——增加中間層次實現控制


 

    不要為它的結束而哭,應當為它的開始而笑。

    C#設計模式系列目錄

歡迎大家掃描下方二維碼,和我一起踏上設計模式的闖關之路吧!

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM