1. 程式人生 > >通俗易懂設計模式解析——代理模式

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

前言

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

代理模式介紹

一、來由

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

二、意圖

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

三、案例圖

 

 

 

四、代理模式程式碼示例

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

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

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

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

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

 

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#設計模式系列目錄

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

  

&n