Proxy Design Pattern trong C# - Cách triển khai và ví dụ
Trong bài viết này mình sẽ giới thiệu đến các bạn Proxy Design Pattern trong C# - Cách triển khai và ví dụ. Đây là một pattern thuộc nhóm Structural Design Pattern trong C#.
Chúng ta sẽ cùng nhau tìm hiểu về Proxy Design Pattern là gì? Cách triển khai nó trong C# và một vài ví dụ cụ thể về nó.
Proxy Design Pattern trong C# là gì?
Proxy Design Pattern là một mẫu thiết kế ủy quyền. Nó cung cấp một đại diện thay thế cho đối tượng khác để kiểm soát quyền truy cập vào đối tượng đó.
Hiểu đơn giản hơn, thì Proxy Design Pattern như là một đối tượng trung gian. Khi chúng ta muốn thao tác với đối tượng chính đều phải thông qua nó.
Bài viết này được đăng tại [free tuts .net]
Các loại Proxy Design Pattern:
- Virtual Proxy: Là một trình giữ chổ cho các đối tượng "expensive to create". Đối tượng thực chỉ được tạo ra khi một khách hàng yêu cầu hoặc truy cập đầu tiên vào đối tượng.
- Remote Proxy: Cung cấp đại diện cục bộ cho một đối tượng nằm trong một khoảng không gian địa chỉ khác.
- Protection Proxy: Bảo vệ một đối tượng và kiểm tra xem người thao tác có quyền truy cập cần thiết trước khi chuyển tiếp yêu cầu hay không.
Ví dụ: Ví dụ cụ thể nhất cho Proxy Design Pattern đó chính là việc khi chúng ta rút tiền ở cây ATM, như hình dưới đây.
Khi chúng ta muốn rút tiền ở ngân hàng, thay vì phải đến trực tiếp ở đó, ta có thể đến cây ATM. Khi chúng ta thao tác rút tiền ở cây ATM, nó sẽ liên lạc với ngân hàng và xác nhận mã pin, số tiền cần rút. Nếu mọi thứ đều ổn thì cây ATM sẽ đưa tiền cho chúng ta.
Vì vậy, ngân hàng là đối tượng thực, còn cây ATM là đối tượng thay thế (đối tượng ủy quyền).
Tại sao nên sử dụng Proxy Design Pattern trong C#
Proxy Server chặn tất cả các yêu cầu đến với server thực để xem các yêu cầu này nó có tự thực hiện được hay không. Nếu không nó sẽ chuyển tiếp các yêu cầu đến máy chủ thực.
Proxy Server có hai mục tiêu chính như sau:
- Improve Performance: Có thể cải thiện đáng kể hiệu suất của ứng dụng. Điều này là do nó lưu kết quả của một yêu cầu trong một khoảng thời gian nhất định.
- Filter Requests: Có thể được sử dụng để lọc yêu cầu đến. Ví dụ: một công ty có thể sử dụng Proxy Server để ngăn chặn nhân viên truy cập vào một nhóm trang web cụ thể nào đó như Facebook, ... .
Cách triển khai và ví dụ về Proxy Design Pattern trong C#
Trong phần này mình sẽ thực hiện triển khai Proxy Design Pattern trong C# thông qua một ví dụ cụ thể sau đây.
Như bạn có thể thấy ở hình trên, ở bên phải ta có một máy tính dùng chung có thư mục chia sẻ. Phía bên trái có các nhân viên đang làm việc cho một công ty phần mềm. Trong máy tính có một thư mục dùng chung chứa các thông tin bí mật mà chỉ có Manager và CEO có truyền truy cập. Còn các Developer thì không được phép truy cập vào.
Trong các tình huống như thế này thì chúng ta nên sử dụng Proxy Design Pattern để quản lý một cách dễ dàng.
Mình sẽ thực hiện triển khai ví dụ trên theo từng bước, các bạn theo dõi nhé.
Bước 1: Tạo class Employee.
Trong class có các thuộc tính của một nhân viên như: Username, Password, Role.
using System; using System.Collections.Generic; using System.Text; namespace ProxyDesignPattern { public class Employee { public string Username { get; set; } public string Password { get; set; } public string Role { get; set; } public Employee(string username, string password, string role) { Username = username; Password = password; Role = role; } } }
Bước 2: Tạo interface ISharedFolder.
using System; using System.Collections.Generic; using System.Text; namespace ProxyDesignPattern { public interface ISharedFolder { void PerformRWOperations(); } }
Bước 3: Tạo Real Object (đối tượng thực).
Class này thực hiện interface ISharedFolder.
using System; using System.Collections.Generic; using System.Text; namespace ProxyDesignPattern { public class SharedFolder : ISharedFolder { public void PerformRWOperations() { Console.WriteLine("Performing Read Write operation on the Shared Folder"); } } }
Bước 4: Tạo Proxy Object (đối tượng thay thế).
using System; using System.Collections.Generic; using System.Text; namespace ProxyDesignPattern { class SharedFolderProxy : ISharedFolder { private ISharedFolder folder; private Employee employee; public SharedFolderProxy(Employee emp) { employee = emp; } public void PerformRWOperations() { if (employee.Role.ToUpper() == "CEO" || employee.Role.ToUpper() == "MANAGER") { folder = new SharedFolder(); Console.WriteLine("Shared Folder Proxy makes call to the RealFolder 'PerformRWOperations method'"); folder.PerformRWOperations(); } else { Console.WriteLine("Shared Folder proxy says 'You don't have permission to access this folder'"); } } } }
Bước 5: Tạo class Program để chạy chương trình và kiểm tra kết quả.
using System; namespace ProxyDesignPattern { class Program { static void Main(string[] args) { Console.WriteLine("Client passing employee with Role Developer to folderproxy"); Employee emp1 = new Employee("Anurag", "Anurag123", "Developer"); SharedFolderProxy folderProxy1 = new SharedFolderProxy(emp1); folderProxy1.PerformRWOperations(); Console.WriteLine(); Console.WriteLine("Client passing employee with Role Manager to folderproxy"); Employee emp2 = new Employee("Pranaya", "Pranaya123", "Manager"); SharedFolderProxy folderProxy2 = new SharedFolderProxy(emp2); folderProxy2.PerformRWOperations(); Console.WriteLine("\n------------------------------------"); Console.WriteLine("Chuong trinh nay duoc dang tai Freetuts.net"); Console.Read(); } } }
Kết quả:
Như vậy là chúng ta đã cùng nhau tìm hiểu về Proxy Design Pattern trong C# - Cách triển khai và ví dụ của nó. Ở bài tiếp theo mình sẽ giới thiệu đến các bạn Iterator Design Pattern trong C#.