前言 今天講的是結構型設計模式中的最後一個,這個模式也就是代理模式,在前段時間我寫的一篇關於正向代理和反向代理的文章。雖說此代理非彼代理。但是代理一詞還是具有相似的含義的。這裡我們繼續使用文章中的代購一個例子來講述一下代理模式吧,人不方便去購買哪些物品,這時就有一個中間人,他來購買。他代替我去購買。 ...
前言
今天講的是結構型設計模式中的最後一個,這個模式也就是代理模式,在前段時間我寫的一篇關於正向代理和反向代理的文章。雖說此代理非彼代理。但是代理一詞還是具有相似的含義的。這裡我們繼續使用文章中的代購一個例子來講述一下代理模式吧,人不方便去購買哪些物品,這時就有一個中間人,他來購買。他代替我去購買。他也就充當了那個代理的職責。我們繼續往下看吧。
代理模式介紹
一、來由
在軟體系統的開放中,有一些對象存在,但是直接訪問會給使用者帶來一些麻煩,或者使用起來不那麼方便,這是就是需要一個代理對象來中間起到關鍵作用。通過這個代理對象進行訪問,以來解決這些問題。這也就是代理模式。
二、意圖
為其他對象提供一種代理以控制對這個對象的訪問。
三、案例圖
四、代理模式代碼示例
看上面的案例圖,我們發現代理模式包含以下部分:
抽象角色:定義代理角色和真實角色的公共介面,這樣來說使用真實角色的地方就可以使用代理角色。
代理角色:包含對真實角色的引用,這樣可以操作真實角色,代理角色不僅僅只是調用真實角色,也會執行其他的操作。
真實角色:定義了代理角色所代表的真實角色。
這裡我們使用的是一個代理進行代購的案例來進行講述,讓我們一起看看如何實現的吧:
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、由於增加了代理對象,增加了一些額外的工作,造成了系統的複雜度
總結
到這裡設計模式中的結構型的各個設計模式我就介紹完了。最後一個代理模式,理解起來也是相對簡單的。重點理解代理一詞。再迴首、看看我們也將看完了設計模式三個部分中的兩個部分。創建型——解決對象創建的問題,對象之間解耦的問題。結構型——主要解決的是類和對象之間的結構問題。這裡又包括類結構和對象結構問題。這裡我們再來回顧一下結構型設計模式及其重點吧
適配器模式——註重轉換介面,使介面匹配、達到復用的目的
橋接模式——註重介面和實現的分離,註重多維度的變化。
裝飾模式——註重穩定介面的前提下對對象進行擴展
組合模式——註重將一對多轉換為一對一,樹型結構層次的關係
外觀模式——簡化介面和客戶端之間的調用依賴關係
享元模式——註重最小單元對象的共用
代理模式——增加中間層次實現控制
不要為它的結束而哭,應當為它的開始而笑。
歡迎大家掃描下方二維碼,和我一起踏上設計模式的闖關之路吧!