文章目錄
前言
一、代理模式(Proxy Pattern)
二、使用步驟
角色
示例
總結
優點
缺點
使用場景
設計模式(Design pattern)是一套被反複使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人了解、保證代碼可靠性。 毫無疑問,設計模式于己于他人于系統都是多赢的,設計模式使代碼編制真正工程化,設計模式是軟體工程的基石,如同大廈的一塊塊磚石一樣。項目中合理的運用設計模式可以完美的解決很多問題,每種模式在現在中都有相應的原理來與之對應,每一個模式描述了一個在我們周圍不斷重複發生的問題,以及該問題的核心解決方案,這也是它能被廣泛應用的原因。
提示:以下是本篇文章正文内容,下面案例可供參考
代理模式屬于結構型模式,為其他對象提供一種代理以控制對這個對象的通路。
在某些情況下,一個對象不适合或者不能直接引用另一個對象,而代理對象可以在用戶端和目标對象之間起到中介的作用。
1、抽象主題(Subject)
通過接口或抽象類聲明真實角色實作的業務方法;
2、代理主題(Proxy)
真實角色的代理,通過真實角色的業務邏輯方法來實作抽象方法,并可以附加自己的操作;
3、真實主題(Real Subject)
定義真實角色所要實作的業務邏輯,供代理角色調用。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CMwQGOilzM4MmM4YmN3UTO5EmZ0UGM5QDO0MzYhZDZ28CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
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、當需要為一個對象的通路(引用)提供一些額外的操作時可以使用智能引用代理。