Proxy Design pattern trong Java là một trong những mẫu thiết kế thuộc nhóm Cấu trúc (Structural design pattern) và theo tôi đây là một trong những mẫu dễ hiểu nhất.

Proxy Design Pattern
Theo định nghĩa của GoF, mục đích của Proxy Design Pattern là: Cung cấp một đại diện hoặc đối tượng thay thế cho một đối tượng khác để kiểm soát quyền truy cập đến nó. Định nghĩa này đã rất rõ ràng và Proxy Design Pattern được sử dụng khi chúng ta muốn cung cấp quyền truy cập có kiểm soát đến một chức năng nào đó.
Ví dụ, chúng ta có một lớp có thể chạy lệnh trên hệ thống. Nếu chúng ta sử dụng nó thì không sao, nhưng nếu đưa chương trình này cho một ứng dụng client, nó có thể gây ra vấn đề nghiêm trọng vì chương trình client có thể chạy lệnh để xóa một số tệp hệ thống hoặc thay đổi cài đặt mà bạn không mong muốn. Trong trường hợp này, có thể tạo một lớp proxy để cung cấp quyền truy cập có kiểm soát cho chương trình.
Lớp chính
Vì chúng ta viết code Java theo kiểu interface nên dưới đây là interface và lớp triển khai của nó.
CommandExecutor.java
package com.journaldev.design.proxy;
public interface CommandExecutor {
public void runCommand(String cmd) throws Exception;
}
CommandExecutorImpl.java
package com.journaldev.design.proxy;
import java.io.IOException;
public class CommandExecutorImpl implements CommandExecutor {
@Override
public void runCommand(String cmd) throws IOException {
// một số xử lý phức tạp
Runtime.getRuntime().exec(cmd);
System.out.println("'" + cmd + "' command executed.");
}
}
Lớp Proxy
Bây giờ chúng ta muốn chỉ cho phép người dùng admin có toàn quyền truy cập vào lớp trên, nếu người dùng không phải admin thì chỉ một số lệnh nhất định mới được phép. Dưới đây là một triển khai proxy đơn giản.
CommandExecutorProxy.java
package com.journaldev.design.proxy;
public class CommandExecutorProxy implements CommandExecutor {
private boolean isAdmin;
private CommandExecutor executor;
public CommandExecutorProxy(String user, String pwd){
if("Pankaj".equals(user) && "J@urnalD$v".equals(pwd)) isAdmin=true;
executor = new CommandExecutorImpl();
}
@Override
public void runCommand(String cmd) throws Exception {
if(isAdmin){
executor.runCommand(cmd);
}else{
if(cmd.trim().startsWith("rm")){
throw new Exception("rm command is not allowed for non-admin users.");
}else{
executor.runCommand(cmd);
}
}
}
}
Chương trình Client
ProxyPatternTest.java
package com.journaldev.design.test;
import com.journaldev.design.proxy.CommandExecutor;
import com.journaldev.design.proxy.CommandExecutorProxy;
public class ProxyPatternTest {
public static void main(String[] args){
CommandExecutor executor = new CommandExecutorProxy("Pankaj", "wrong_pwd");
try {
executor.runCommand("ls -ltr");
executor.runCommand(" rm -rf abc.pdf");
} catch (Exception e) {
System.out.println("Exception Message::"+e.getMessage());
}
}
}
Kết quả khi chạy chương trình trên:
'ls -ltr' command executed.
Exception Message::rm command is not allowed for non-admin users.
Ứng dụng của Proxy Design Pattern
Proxy Design Pattern thường được sử dụng để kiểm soát quyền truy cập hoặc cung cấp một lớp bọc (wrapper) nhằm tăng hiệu năng. Gói Java RMI sử dụng Proxy Pattern.
Trên đây là toàn bộ nội dung về Proxy Design Pattern trong Java.