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

前言

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

代理模式介紹

1、來由

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

2、意圖

  爲其餘對象提供一種代理以控制對這個對象的訪問。ide

3、案例圖

 

 

 

4、代理模式代碼示例

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

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

代理角色:包含對真實角色的引用,這樣能夠操做真實角色,代理角色不只僅只是調用真實角色,也會執行其餘的操做。設計

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

這裏咱們使用的是一個代理進行代購的案例來進行講述,讓咱們一塊兒看看如何實現的吧:code

 

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("違禁品"); } } }

 

使用場景及優缺點

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

1、使用場景

根據代理模式的職責咱們能夠分爲如下的使用場景:
遠程代理:爲兩個不一樣地址的對象信息代理,典型例子就是客戶端與服務之間。客戶端調用服務。對象

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

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

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

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

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

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

2、優勢

一、增長了中間代理層,下降了客戶端與對象之間的耦合度

二、中間的代理對對象增長了保護層次,同時也能夠增長一些額外的操做例如權限控制、智能化

三、職責清晰明瞭。抽象—真實—代理

3、缺點

一、因爲增長了代理對象,有些狀況可能會形成代理之間的請求變慢

二、因爲增長了代理對象,增長了一些額外的工做,形成了系統的複雜度

總結

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

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

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

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

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

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

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

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


 

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

    C#設計模式系列目錄

歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!

  

 

原文出處:https://www.cnblogs.com/hulizhong/p/11506759.html

相關文章
相關標籤/搜索