تصميم البروكسي هو أحد أنماط التصميم الهيكلي وفي رأيي هو أحد أبسط الأنماط لفهمه.
نمط تصميم البروكسي
نية نمط تصميم البروكسي وفقًا لـ GoF هي: توفير بديل أو مكان بديل لكائن آخر للتحكم في الوصول إليه. التعريف ذاته واضح جدًا، ويتم استخدام نمط تصميم البروكسي عندما نريد توفير وصول مراقب لوظيفة معينة. لنفترض أن لدينا فئة يمكنها تشغيل بعض الأوامر على النظام. الآن، إذا كنا نستخدمها، فهي بخير، ولكن إذا أردنا أن نقدم هذا البرنامج لتطبيق العميل، قد يكون هناك مشاكل خطيرة لأن برنامج العميل قد يصدر أمرًا لحذف بعض ملفات النظام أو تغيير بعض الإعدادات التي لا ترغب في تغييرها. هنا يمكن إنشاء فئة بروكسي لتوفير وصول مراقب للبرنامج.
نمط تصميم البروكسي – الفئة الرئيسية
نظرًا لأننا نبرمج بلغة الجافا بناءً على واجهات، إليك واجهتنا وفئة تنفيذها. 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 نمط الوكيل. هذا كل شيء بالنسبة لنمط تصميم الوكيل في جافا.
Source:
https://www.digitalocean.com/community/tutorials/proxy-design-pattern