Proxy Design Pattern: Code ví dụ, cách dùng và ứng dụng thực tế
2 phút đọc06/09/2025
Chris Pham
Technical Writer
0 lượt xem
0 lượt xem
Reading Time: 2minutes
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.
Về tác giả
Chris PhamTechnical Writer
I have over 5 years of experience writing technical documentation for tech products, making them accessible and user-friendly. My focus is always on providing clear and precise information.
@#@
Tôi đã có hơn 5 năm kinh nghiệm viết tài liệu kỹ thuật cho các sản phẩm công nghệ, giúp người dùng dễ dàng tiếp cận và sử dụng. Tôi luôn tập trung vào việc cung cấp thông tin chính xác và dễ hiểu.
Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn
Thảo luận (0)
Đăng nhập để thảo luận
Bài viết liên quan
{"success":true,"head":"<title>Proxy Design Pattern: Code ví dụ, cách dùng và ứng dụng thực tế - CyStack Tutorial</title>\n<meta name=\"description\" content=\"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\"/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-video-preview:-1, max-image-preview:large\"/>\n<link rel=\"canonical\" href=\"https://blog.cystack.org/tutorial/2025/09/06/proxy-design-pattern-trong-java/\" />\n<meta property=\"og:locale\" content=\"en_US\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"Proxy Design Pattern: Code ví dụ, cách dùng và ứng dụng thực tế - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"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\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/2025/09/06/proxy-design-pattern-trong-java/\" />\n<meta property=\"og:site_name\" content=\"CyStack Tutorial\" />\n<meta property=\"article:tag\" content=\"vi\" />\n<meta property=\"article:section\" content=\"Java\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/06184007/proxy-design-pattern-trong-java.jpg\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/06184007/proxy-design-pattern-trong-java.jpg\" />\n<meta property=\"og:image:width\" content=\"1200\" />\n<meta property=\"og:image:height\" content=\"630\" />\n<meta property=\"og:image:alt\" content=\"Proxy Design Pattern\" />\n<meta property=\"og:image:type\" content=\"image/jpeg\" />\n<meta property=\"article:published_time\" content=\"2025-09-06T18:41:27+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"Proxy Design Pattern: Code ví dụ, cách dùng và ứng dụng thực tế - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"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\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/06184007/proxy-design-pattern-trong-java.jpg\" />\n<meta name=\"twitter:label1\" content=\"Written by\" />\n<meta name=\"twitter:data1\" content=\"Chris Pham\" />\n<meta name=\"twitter:label2\" content=\"Time to read\" />\n<meta name=\"twitter:data2\" content=\"2 minutes\" />\n<script type=\"application/ld+json\" class=\"rank-math-schema\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https://blog.cystack.org/tutorial/#person\",\"name\":\"CyStack Tutorial\"},{\"@type\":\"WebSite\",\"@id\":\"https://blog.cystack.org/tutorial/#website\",\"url\":\"https://blog.cystack.org/tutorial\",\"name\":\"CyStack Tutorial\",\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https://s2.cystack.net/tutorial/06184007/proxy-design-pattern-trong-java.jpg\",\"url\":\"https://s2.cystack.net/tutorial/06184007/proxy-design-pattern-trong-java.jpg\",\"width\":\"1200\",\"height\":\"630\",\"caption\":\"Proxy Design Pattern\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/2025/09/06/proxy-design-pattern-trong-java/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":\"1\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":\"2\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/category/java/\",\"name\":\"Java\"}},{\"@type\":\"ListItem\",\"position\":\"3\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/09/06/proxy-design-pattern-trong-java/\",\"name\":\"Proxy Design Pattern: Code v\\u00ed d\\u1ee5, c\\u00e1ch d\\u00f9ng v\\u00e0 \\u1ee9ng d\\u1ee5ng th\\u1ef1c t\\u1ebf\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/2025/09/06/proxy-design-pattern-trong-java/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/2025/09/06/proxy-design-pattern-trong-java/\",\"name\":\"Proxy Design Pattern: Code v\\u00ed d\\u1ee5, c\\u00e1ch d\\u00f9ng v\\u00e0 \\u1ee9ng d\\u1ee5ng th\\u1ef1c t\\u1ebf - CyStack Tutorial\",\"datePublished\":\"2025-09-06T18:41:27+07:00\",\"dateModified\":\"2025-09-06T18:41:27+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/06184007/proxy-design-pattern-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/09/06/proxy-design-pattern-trong-java/#breadcrumb\"}},{\"@type\":\"Person\",\"@id\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"name\":\"Chris Pham\",\"url\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://secure.gravatar.com/avatar/7a3584c941fa360ac061b2a8f15684ced7b92daa1f09481be135a684d989e9b9?s=96&d=mm&r=g\",\"url\":\"https://secure.gravatar.com/avatar/7a3584c941fa360ac061b2a8f15684ced7b92daa1f09481be135a684d989e9b9?s=96&d=mm&r=g\",\"caption\":\"Chris Pham\",\"inLanguage\":\"en-US\"}},{\"@type\":\"BlogPosting\",\"headline\":\"Proxy Design Pattern: Code v\\u00ed d\\u1ee5, c\\u00e1ch d\\u00f9ng v\\u00e0 \\u1ee9ng d\\u1ee5ng th\\u1ef1c t\\u1ebf - CyStack Tutorial\",\"keywords\":\"Proxy design pattern,Proxy Design Pattern trong Java\",\"datePublished\":\"2025-09-06T18:41:27+07:00\",\"dateModified\":\"2025-09-06T18:41:27+07:00\",\"articleSection\":\"Java\",\"author\":{\"@id\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"name\":\"Chris Pham\"},\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"description\":\"Proxy Design pattern trong Java l\\u00e0 m\\u1ed9t trong nh\\u1eefng m\\u1eabu thi\\u1ebft k\\u1ebf thu\\u1ed9c nh\\u00f3m C\\u1ea5u tr\\u00fac (Structural design pattern) v\\u00e0 theo t\\u00f4i \\u0111\\u00e2y l\\u00e0 m\\u1ed9t trong nh\\u1eefng m\\u1eabu d\\u1ec5 hi\\u1ec3u\",\"name\":\"Proxy Design Pattern: Code v\\u00ed d\\u1ee5, c\\u00e1ch d\\u00f9ng v\\u00e0 \\u1ee9ng d\\u1ee5ng th\\u1ef1c t\\u1ebf - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/2025/09/06/proxy-design-pattern-trong-java/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/09/06/proxy-design-pattern-trong-java/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/06184007/proxy-design-pattern-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/09/06/proxy-design-pattern-trong-java/#webpage\"}}]}</script>\n"}