תבנית העיצוב "פרוקסי" (Proxy) היא אחת מתבניות העיצוב המבניות ובעיני זו, היא אחת התבניות הפשוטות ביותר להבנה.
מטרת תבנית העיצוב "פרוקסי" לפי ההגדרה של GoF היא: לספק חילוף או מקום מציין לאובייקט אחר כדי לשלוט בגישה אליו. ההגדרה עצמה היא ברורה מאוד ותבנית זו משמשת כאשר נרצה לספק גישה שלטונית לפונקציונליות מסוימת. נניח שיש לנו מחלקה שיכולה להריץ פקודה מסוימת במערכת. כעת אם אנו משתמשים בה, זה בסדר, אך אם נרצה למסור את התוכנית הזו לאפליקציית לקוח, ייתכנו בעיות רציניות מאוד, מכיוון שהתוכנית הלקוח יכולה להפעיל פקודה למחיקת קבצי מערכת או שינוי במערכת שאנו לא רוצים. כאן ניתן ליצור מחלקת פרוקסי שתספק גישה שלטונית לתוכנית.
תבנית העיצוב "פרוקסי" – מחלקה ראשית
מאחר שאנו כותבים ב-Java במונחי ממשקים, הנה ממשקנו וממשק המימוש שלו. 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 {
//מימוש כבד מסוים
Runtime.getRuntime().exec(cmd);
System.out.println("'" + cmd + "' command executed.");
}
}
תבנית העיצוב של הפרוקסי – מחלקת פרוקסי
כעת נרצה לספק רק למשתמשי מנהל גישה מלאה למחלקה הנ"ל, אם המשתמש אינו מנהל, אז רק פקודות מוגבלות יתרשמו. הנה מימוש מאוד פשוט של מחלקת פרוקסי. 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);
}
}
}
}
תוכנית לקוח של תבנית העיצוב של פרוקסי
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());
}
}
}
הפלט של דוגמת תוכנית העיצוב של הפרוקסי מעלה הוא:
'ls -ltr' command executed.
Exception Message::rm command is not allowed for non-admin users.
שימושים נפוצים של תבנית העיצוב של הפרוקסי הם לשלוט בגישה או לספק מימוש עטיפה לביצוע יעיל יותר. החבילה Java RMI משתמשת בתבנית העיצוב של הפרוקסי. זהו כל הכל בנושא תבנית העיצוב של הפרוקסי ב-Java.
Source:
https://www.digitalocean.com/community/tutorials/proxy-design-pattern