天天看點

【愚公系列】2021年12月 二十三種設計模式(十二)-代理模式(Proxy Pattern)

文章目錄

前言

一、代理模式(Proxy Pattern)

二、使用步驟

角色

示例

總結

優點

缺點

使用場景

設計模式(Design pattern)是一套被反複使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人了解、保證代碼可靠性。 毫無疑問,設計模式于己于他人于系統都是多赢的,設計模式使代碼編制真正工程化,設計模式是軟體工程的基石,如同大廈的一塊塊磚石一樣。項目中合理的運用設計模式可以完美的解決很多問題,每種模式在現在中都有相應的原理來與之對應,每一個模式描述了一個在我們周圍不斷重複發生的問題,以及該問題的核心解決方案,這也是它能被廣泛應用的原因。

提示:以下是本篇文章正文内容,下面案例可供參考

代理模式屬于結構型模式,為其他對象提供一種代理以控制對這個對象的通路。

在某些情況下,一個對象不适合或者不能直接引用另一個對象,而代理對象可以在用戶端和目标對象之間起到中介的作用。

1、抽象主題(Subject)

通過接口或抽象類聲明真實角色實作的業務方法;

2、代理主題(Proxy)

真實角色的代理,通過真實角色的業務邏輯方法來實作抽象方法,并可以附加自己的操作;

3、真實主題(Real Subject)

定義真實角色所要實作的業務邏輯,供代理角色調用。

【愚公系列】2021年12月 二十三種設計模式(十二)-代理模式(Proxy Pattern)
命名空間ProxyPattern中包含Employee員工類充當抽象主題,Leader上司類充當代理主題,Staff普通員工類充當真實主題。本案例嘗試通過員工采購一批桌子來介紹上司是如何通過使用普通員工作為自己的代理為公司采購商品的。

public abstract class Employee {

    public abstract void Purchase(string goods);

    protected virtual void OnPurchasing() {
        Console.WriteLine("Employee.OnPurchasing()");
    }

    protected virtual void OnPurchased() {
        Console.WriteLine("Employee.OnPurchased()");
    }

}      

員工類Employee。

public class Staff : Employee {
 
    public override void Purchase(string goods) {
        OnPurchasing();
        Console.WriteLine($"Purchase some {goods}s!");
        OnPurchased();
    }
 
    protected override void OnPurchasing() {
        Console.WriteLine("Staff.OnPurchasing()");
    }
 
    protected override void OnPurchased() {
        Console.WriteLine("Staff.OnPurchasing()");
    }
 
}      

普通員工類Staff。

public class Leader : Employee {

    private Staff _staff = null;

    public Leader() {
        _staff = new Staff();
    }

    public override void Purchase(string goods) {
        _staff.Purchase(goods);
    }

}      

上司類Leader,内部維持一個員工的引用,并在Purchase采購方法調用普通員工的采購方法。完成了一次代理購物。

public class Program {

    private static Employee _employee = null;

    public static void Main(string[] args) {
        _employee = new Leader();
        _employee.Purchase("desk");

        Console.ReadKey();
    }

}      

以上是調用方的代碼,以下是這個案例的輸出結果:

Staff.OnPurchasing()
Purchase some desks!
Staff.OnPurchasing()      

1、代理模式能夠将調用用于真正被調用的對象隔離,在一定程度上降低了系統的耦合度;

2、代理對象在用戶端和目标對象之間起到一個中介的作用,這樣可以起到對目标對象的保護;

3、代理對象可以在對目标對象送出請求之前進行一個額外的操作,例如權限檢查等。

1、由于在用戶端和真實主題之間增加了代理對象,是以有些類型的代理模式可能會造成請求的處理速度變慢;

2、實作代理模式需要額外的工作,進而增加了系統的實作複雜度。

1、當用戶端對象需要通路遠端主機中的對象時可以使用遠端代理;

2、當需要用一個消耗資源較少的對象來代表一個消耗資源較多的對象,進而降低系統開銷、縮短運作時間時可以使用虛拟代理,例如一個對象需要很長時間才能完成加載時;

3、當需要為某一個被頻繁通路的操作結果提供一個臨時存儲空間,以供多個用戶端共享通路這些結果時可以使用緩沖代理。通過使用緩沖代理,系統無須在用戶端每一次通路時都重新執行操作,隻需直接從臨時緩沖區擷取操作結果即可;

4、當需要控制對一個對象的通路,為不同使用者提供不同級别的通路權限時可以使用保護代理;

5、當需要為一個對象的通路(引用)提供一些額外的操作時可以使用智能引用代理。

繼續閱讀