Proxy Pattern cung cấp một đối tượng đại diện (surrogate/placeholder) để kiểm soát truy cập đến đối tượng thực tế (RealSubject). Proxy triển khai cùng interface với RealSubject để có thể thay thế nhau.
Các thành phần (Participants)
- Subject (Interface): Định nghĩa interface chung cho RealSubject và Proxy.
- RealSubject: Đối tượng thực sự chứa logic nghiệp vụ.
- Proxy: Nắm giữ reference đến RealSubject, kiểm soát truy cập, có thể thêm logic trước/sau (lazy loading, logging, caching, access control...).
Ví dụ: Proxy cho Server xử lý đơn hàng
// 1. Subject Interface
public interface IServer
{
void TakeOrder(string order);
string DeliverOrder();
void ProcessPayment(string payment);
}
// 2. RealSubject
public class Server : IServer
{
private string _order;
public void TakeOrder(string order)
{
Console.WriteLine($"[Server] Takes order: {order}");
_order = order;
}
public string DeliverOrder() => _order;
public void ProcessPayment(string payment)
{
Console.WriteLine($"[Server] Processes payment: {payment}");
}
}
// 3. Proxy
public class ServerProxy : IServer
{
private readonly Server _server = new Server();
private string _order;
public void TakeOrder(string order)
{
Console.WriteLine($"[Proxy] Logging order: {order}");
_server.TakeOrder(order); // Delegate
_order = order;
}
public string DeliverOrder()
{
Console.WriteLine("[Proxy] Delivering order...");
return _server.DeliverOrder();
}
public void ProcessPayment(string payment)
{
Console.WriteLine("[Proxy] Validating payment...");
if (string.IsNullOrEmpty(payment))
throw new ArgumentException("Payment required");
_server.ProcessPayment(payment);
}
}
// 4. Client
class Program
{
static void Main()
{
IServer proxy = new ServerProxy();
proxy.TakeOrder("Pizza");
Console.WriteLine($"Delivered: {proxy.DeliverOrder()}");
proxy.ProcessPayment("Credit Card");
Console.ReadLine();
}
}
Kết quả
[Proxy] Logging order: Pizza
[Server] Takes order: Pizza
[Proxy] Delivering order...
[Server] Takes order: Pizza
[Proxy] Validating payment...
[Server] Processes payment: Credit Card
Các loại Proxy phổ biến
| Loại | Mục đích |
|---|---|
| Virtual Proxy | Tạo đối tượng tốn kém (heavy) chỉ khi cần (lazy initialization). |
| Protection Proxy | Kiểm soát quyền truy cập (ACL, authentication). |
| Remote Proxy | Đại diện cho đối tượng ở process/máy khác (WCF, gRPC, .NET Remoting). |
| Smart Proxy | Thêm hành vi: reference counting, locking, caching, logging. |
| Cache Proxy | Lưu kết quả gọi trước để trả nhanh lần sau. |
Proxy trong .NET Framework
RealProxy/TransparentProxy(Remoting, legacy).DynamicProxy(Castle DynamicProxy) - dùng bởi Moq, Entity Framework, ASP.NET Core interception.DispatchProxy(CoreCLR) - tạo proxy động cho interface.
Lưu ý: Proxy khác với Adapter (chuyển interface) và Decorator (thêm hành vi nhưng không kiểm soát truy cập). Proxy kiểm soát truy cập đến RealSubject.