Mẫu Thiết Kế Proxy Là Gì?
Mẫu Thiết Kế Proxy là một mẫu thiết kế cấu trúc. Nó cung cấp một đối tượng thay thế hoặc đại diện để kiểm soát quyền truy cập vào một đối tượng khác (đối tượng thực sự).
Hãy tưởng tượng nó như một người trung gian:
- Thêm hành vi bổ sung (như ghi log, bảo mật, lưu bộ nhớ đệm, tải lười, v.v.)
- Kiểm soát việc tạo ra các đối tượng tốn kém hoặc nhạy cảm.
- Ẩn đi những phức tạp từ phía khách hàng.
Phân Tích Thực Tế
Hãy tưởng tượng bạn muốn truy cập một cái tủ khóa ngân hàng:
- Bạn không truy cập trực tiếp vào nó.
- Thay vào đó, một proxy (nhân viên ngân hàng) sẽ kiểm tra thông tin của bạn và cho bạn quyền truy cập.
- Ở đây, nhân viên ngân hàng đóng vai trò là proxy cho cái tủ khóa (đối tượng thực sự).
Các Loại Proxy
- Proxy Ảo – Tải lười các đối tượng nặng.
- Proxy Bảo Vệ – Kiểm soát quyền truy cập với xác thực/ủy quyền.
- Proxy Từ Xa – Hành động như đại diện cục bộ cho các đối tượng từ xa (như Gọi Phương Thức Từ Xa).
- Proxy Lưu Bộ Nhớ – Lưu trữ kết quả để tăng hiệu suất.
- Proxy Thông Minh – Thêm các hành động bổ sung (như ghi log, giám sát, đếm tham chiếu).
Cấu Trúc (Phân Tích UML)
Mẫu Proxy có ba vai trò chính:
- Chủ thể (Giao diện/Lớp Trừu Tượng): Giao diện chung cho cả RealSubject và Proxy.
- RealSubject: Đối tượng thực sự thực hiện công việc thực tế.
- Proxy: Hành động như một đại diện, kiểm soát quyền truy cập vào RealSubject.
Client → Subject → Proxy → RealSubject
Ví Dụ Cụ Thể
Bước 1: Tạo Giao Diện Chủ Thể
public interface Image {
void display();
}
Bước 2: Lớp Real Subject
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Đang tải " + fileName);
}
@Override
public void display() {
System.out.println("Đang hiển thị " + fileName);
}
}
Bước 3: Lớp Proxy
public class ProxyImage implements Image {
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName) {
this.fileName = fileName;
}
@Override
public void display() {
if (realImage == null) {
realImage = new RealImage(fileName); // Tải lười
}
realImage.display();
}
}
Bước 4: Mã Khách Hàng
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("photo.jpg");
// Hình ảnh sẽ được tải từ đĩa chỉ một lần
image.display(); // Tải + Hiển thị
image.display(); // Chỉ Hiển thị (không tải)
}
}
Kết Quả
Đang tải photo.jpg
Đang hiển thị photo.jpg
Đang hiển thị photo.jpg
Ví Dụ Thực Tế Về Proxy Trong Java
java.lang.reflect.Proxy→ Proxy động cho việc triển khai giao diện tại thời gian chạy.- Proxy AOP của Spring → Được sử dụng cho việc chặn phương thức (ghi log, giao dịch, bảo mật).
- Tải lười Hibernate → Các thực thể được đại diện bằng các proxy cho đến khi được truy cập.
Ưu Điểm Của Mẫu Proxy
✅ Cung cấp quyền truy cập có kiểm soát vào các đối tượng.
✅ Hỗ trợ khởi tạo lười để tăng hiệu suất.
✅ Thêm chức năng bổ sung mà không cần sửa đổi mã của đối tượng thực sự.
Kết Luận
Mẫu Thiết Kế Proxy là một mẫu cấu trúc mạnh mẽ cho phép chúng ta kiểm soát quyền truy cập, cải thiện hiệu suất và thêm các tính năng bổ sung mà không cần chạm vào mã của đối tượng thực sự.
Nó được sử dụng rộng rãi trong các framework Java như Spring và Hibernate, vì vậy đây là một mẫu mà mọi lập trình viên đều nên biết.
Đây là phần 6 trong chuỗi Mẫu Thiết Kế Java.
Nếu bạn thấy bài viết này hữu ích, hãy chia sẻ phản hồi của bạn. Cũng cho tôi biết nếu bạn đã sử dụng mẫu proxy trong các dự án của mình.
Phần tiếp theo: Mẫu Thiết Kế Facade!