close up photo of programming of codes

codecungnhau.com

Một trang web về kỹ thuật lập trình

C# Design Patterns: Proxy

Proxy là một mẫu thiết kế cấu trúc cung cấp một đối tượng hoạt động thay thế cho một đối tượng dịch vụ thực được client sử dụng. Một proxy nhận các yêu cầu của client, thực hiện một số công việc (kiểm soát truy cập, bộ nhớ đệm, v.v.) và sau đó chuyển yêu cầu đến một đối tượng dịch vụ.

Đối tượng proxy có giao diện giống như một dịch vụ, điều này làm cho nó có thể hoán đổi cho nhau với một đối tượng thực khi được chuyển cho một client.

Cách sử dụng mẫu

Sử dụng: Mặc dù mẫu Proxy không phải là thường xuyên trong hầu hết các ứng dụng C#, nhưng nó vẫn rất hữu ích trong một số trường hợp đặc biệt. Không thể thay thế khi bạn muốn thêm một số hành vi bổ sung vào một đối tượng của một số lớp hiện có mà không thay đổi mã ứng dụng.

Nhận dạng: Proxy ủy quyền tất cả công việc thực tế cho một số đối tượng khác. Cuối cùng, mỗi phương thức proxy phải tham chiếu đến một đối tượng dịch vụ trừ khi proxy là một lớp con của một dịch vụ.

Chương trình mẫu

Program.cs

using System;
namespace DesignPatterns.Proxy.Conceptual
{
    // Giao diện Subject  khai báo các hoạt động chung cho cả RealSubject và Proxy.
    // Miễn là client làm việc với RealSubject bằng giao diện này, bạn sẽ có thể 
    // chuyển nó qua proxy thay vì chủ thể thực.
    public interface ISubject
    {
        void Request();
    }
    
    // RealSubject chứa một số logic cốt lõi. Thông thường, RealSubject có khả năng 
    // thực hiện một số công việc hữu ích cũng có thể rất chậm hoặc nhạy cảm - ví dụ: 
    // hiệu chỉnh dữ liệu đầu vào. Proxy có thể giải quyết những vấn đề này mà không 
    // cần bất kỳ thay đổi nào đối với mã của RealSubject.
    class RealSubject : ISubject
    {
        public void Request()
        {
            Console.WriteLine("RealSubject: Handling Request.");
        }
    }
    
    // Proxy có giao diện giống với RealSubject.
    class Proxy : ISubject
    {
        private RealSubject _realSubject;
        
        public Proxy(RealSubject realSubject)
        {
            this._realSubject = realSubject;
        }
        
        // Các ứng dụng phổ biến nhất của mẫu Proxy là tải chậm, bộ nhớ đệm, kiểm 
        // soát truy cập, ghi nhật ký, v.v. Một Proxy có thể thực hiện một trong những 
        // điều này và sau đó, tùy thuộc vào kết quả, chuyển việc thực thi đến cùng 
        // một phương thức trong một đối tượng RealSubject được liên kết.
        public void Request()
        {
            if (this.CheckAccess())
            {
                this._realSubject.Request();
                this.LogAccess();
            }
        }
        
        public bool CheckAccess()
        {
            // Một số kiểm tra thực sự nên ở đây.
            Console.WriteLine("Proxy: Checking access prior to firing a real request.");
            return true;
        }
        
        public void LogAccess()
        {
            Console.WriteLine("Proxy: Logging the time of request.");
        }
    }
    
    public class Client
    {
        // Mã client phải hoạt động với tất cả các đối tượng (cả đối tượng và proxy) 
        // thông qua Subject để hỗ trợ cả đối tượng thực và proxy. Tuy nhiên, trong 
        // cuộc sống thực, client chủ yếu làm việc trực tiếp với đối tượng thực của 
        // nó. Trong trường hợp này, để triển khai mẫu dễ dàng hơn, bạn có thể
        //  mở rộng proxy của mình từ lớp của chủ thể thực.
        public void ClientCode(ISubject subject)
        {
            // ...
            
            subject.Request();
            
            // ...
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Client client = new Client();
            
            Console.WriteLine("Client: Executing the client code with a real subject:");
            RealSubject realSubject = new RealSubject();
            client.ClientCode(realSubject);
            Console.WriteLine();
            Console.WriteLine("Client: Executing the same client code with a proxy:");
            Proxy proxy = new Proxy(realSubject);
            client.ClientCode(proxy);
        }
    }
}

Kết quả

Client: Executing the client code with a real subject:
RealSubject: Handling request.
Client: Executing the same client code with a proxy:
Proxy: Checking access prior to firing a real request.
RealSubject: Handling request.
Proxy: Logging the time of request.

Đã đăng vào

trong

,

bởi

Thẻ:

Bình luận

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *