Khái niệm:
Cung cấp một đối tượng thay thế hoặc placeholder cho một đối tượng khác để truy xuất đến nó.
Mức độ sử dụng: khá cao
UML Class Diagram
Những lớp và/hoặc đối tượng trong mẫu thiết kế này:
- Proxy (MathProxy):
+ bảo trì một tham chiếu để cho proxy truy xuất đối tượng thật. Proxy có thể nhắm vào một đối tượng nếu các interface RealSubject và Subject giống nhau.
+ cung cấp một interface giống hệt với interface của Subject để một proxy có thể được thay thế cho đối tượng thật.
+ điều khiển việc truy xuất đến đối tượng thật và có thể chịu trách nhiệm trong việc tạo ra và hủy nó.
+ những nhiệm vụ khác tùy thuộc vào loại proxy:
* remote proxy: chịu trách nhiệm mã hóa một request và các đối số của nó và gửi các request được mã hóa cho đối tượng thật trong vùng địa chỉ khác.
* virtual proxy: có thể bắt (cache) thông tin bổ sung về đối tượng thật để chúng có thể hoãn việc truy xuất nó. Ví dụ, ImageProxy trong Motivation bắt giới hạn của các hình ảnh thật.
* protection proxy: kiểm tra “người gọi” có quyền truy xuất được yêu cầu để thực thi một request hay không.
- Subject (IMath): định nghĩa interface chung cho Realsubject và Proxy để một Proxy có thể được sử dụng bất kì đâu mà một RealSubject được mong đợi.
- RealSubject (Math): định nghĩa một đối tượng thật mà proxy mô tả.
Proxy: khi nào sử dụng và sử dụng ở đâu
Trong các ngôn ngữ hướng đối tượng, các đối tượng thực hiện công việc mà chúng được cho biết thông qua public interface của chúng. Những client của các đối tượng này mong muốn công việc này được thực hiện nhanh chóng và hiệu qủa. Tuy nhiên, có các tình huống nơi một đối tượng bị hạn chế và không thể tiếp tục thực hiện nhêệm vụ của nó. Thông thường, việc này xảy ra khi có một dependency trên một remote resource (một lời gọi đến máy tính khác chẳng hạn) hoặc khi một đối tượng mất nhiều thời gian để load. Trong những trường hợp tương tự như thế này, bạn chọn mẫu thiết kế Proxy và tạo một đối tượng proxy mà “đối tượng đóng thể” (stand-in) cho một đối tượng gốc. Proxy chuyển request đến đối tượng đích. Interface của đối tượng Proxy này giống như đối tượng gốc và các client không thể biết rằng họ đang xử lý với một proxy hơn là một đối tượng thật.
Có 3 mẫu proxy khác nhau:
+ Remote proxy: chịu trách nhiệm mã hóa một request và chuyển request được mã hóa cho một đối tượng thật trong một không gian địa chỉ khác (app domain, process hoặc machine).
+ Virtual proxy: có thể bắt thông tin bổ sung về một đối tượng thật để chúng có thể hoãn việc truy xuất nó (chẳng hạn như just-in-time loading, on-demand loading hoặc lazy loading).
+ Protection proxy: kiểm tra “người gọi” có các quyền truy xuất riêng để thực hiện request.
Thực tế, còn có kiểu proxy khác được gọi là Smart Reference. Một Smart Reference là một proxy cho một pointer, nhưng vì có ít ứng dụng cho các pointer trong .NET và bạn ít khi nào sử dụng loại proxy này.
Demo