شارك المقالة
شرح Proxy Design Pattern بالتفصيل مع مثال عملي بلغة Java، الفرق بين استخدامه وعدم استخدامه، وأهم المميزات والعيوب مع تطبيق عملي على نظام مدفوعات.

شرح Proxy Design Pattern بالتفصيل في Java مثال عملي مع المميزات والعيوب

شرح Proxy Design Pattern بالتفصيل – فهم نمط الوكيل في Java مع مثال عملي


في الأنظمة البرمجية الكبيرة، قد نحتاج أحيانًا إلى التحكم في الوصول إلى كائن معيّن دون تعديل الكود الأساسي الخاص به. هنا يظهر دور Proxy Design Pattern أو نمط تصميم الوكيل، والذي يُعد من الأنماط الهيكلية (Structural Design Patterns) في البرمجة كائنية التوجه (OOP).
يتيح لنا هذا النمط إنشاء كائن وسيط يعمل كـ “وكيل” يتحكم في الوصول إلى الكائن الحقيقي، مع إمكانية إضافة خصائص مثل التحقق من الصلاحيات، التسجيل (Logging)، أو تحسين الأداء دون المساس بالكائن الأصلي.

ما هو Proxy Design Pattern؟


نمط الوكيل هو نمط تصميم هيكلي يوفر كائنًا بديلاً (Proxy) يتحكم في الوصول إلى كائن حقيقي (Real Object).
يقوم هذا الوكيل بنفس واجهة الكائن الحقيقي، لكنه يضيف طبقة تحكم إضافية قبل أو بعد تنفيذ الطلب.

يمكن استخدام Proxy Design Pattern في الحالات التالية:
– وكيل الحماية (Protection Proxy): للتحكم في الصلاحيات.
– وكيل التخزين المؤقت (Caching Proxy): لتحسين الأداء.
– الوكيل البعيد (Remote Proxy): للتعامل مع كائنات موجودة على خادم بعيد.
– الوكيل الافتراضي (Virtual Proxy): لتحميل الكائنات الثقيلة عند الحاجة فقط (Lazy Initialization).

مثال عملي بدون استخدام Proxy Design Pattern


class PaymentProcessor {
    public void processPayment(String paymentType) {
        if (paymentType.equals("CreditCard")) {
            System.out.println("Processing Credit Card Payment...");
        } else if (paymentType.equals("PayPal")) {
            System.out.println("Processing PayPal Payment...");
        } else {
            System.out.println("Invalid payment type.");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        PaymentProcessor processor = new PaymentProcessor();
        processor.processPayment("CreditCard");
        processor.processPayment("PayPal");
    }
}

عيوب الكود بدون Proxy Pattern


عدم وجود تحكم إضافي:
إذا أردنا إضافة تحقق من الصلاحيات أو تسجيل العمليات، سنضطر لتعديل الكود الأساسي مباشرة.

صعوبة التوسيع:
كل ميزة جديدة تتطلب تعديل الكلاس نفسه، مما يخالف مبدأ Open/Closed Principle.

زيادة استهلاك الموارد:
يتم إنشاء الكائن واستخدامه مباشرة حتى لو لم تكن هناك حاجة فعلية لكل وظائفه.

مثال عملي باستخدام Proxy Design Pattern


interface Payment {
    void processPayment(String paymentType);
}

class RealPaymentProcessor implements Payment {
    public void processPayment(String paymentType) {
        if (paymentType.equals("CreditCard")) {
            System.out.println("Processing Credit Card Payment...");
        } else if (paymentType.equals("PayPal")) {
            System.out.println("Processing PayPal Payment...");
        } else {
            System.out.println("Invalid payment type.");
        }
    }
}

class PaymentProxy implements Payment {
    private RealPaymentProcessor realPaymentProcessor;
    
    @Override
    public void processPayment(String paymentType) {
        if (realPaymentProcessor == null) {
            realPaymentProcessor = new RealPaymentProcessor();
        }
        if (checkAccess()) {
            realPaymentProcessor.processPayment(paymentType);
            logAccess(paymentType);
        }
    }
    
    private boolean checkAccess() {
        System.out.println("Checking access permissions...");
        return true;
    }
    
    private void logAccess(String paymentType) {
        System.out.println("Logging payment type: " + paymentType);
    }
}

public class Main {
    public static void main(String[] args) {
        Payment paymentProxy = new PaymentProxy();
        paymentProxy.processPayment("CreditCard");
        paymentProxy.processPayment("PayPal");
    }
}

الفرق بين النهجين


بدون Proxy Design Pattern:
– لا يوجد تحكم في الوصول.
– لا يمكن إضافة تسجيل أو تحقق بسهولة.
– صعوبة في التوسيع مستقبلاً.

باستخدام Proxy Design Pattern:
– إمكانية التحكم في الصلاحيات.
– إضافة تسجيل (Logging) دون تعديل الكائن الأصلي.
– تحسين الأداء باستخدام التحميل الكسول (Lazy Initialization).
– فصل المسؤوليات بشكل احترافي.

مميزات Proxy Design Pattern


التحكم في الوصول:
يمكن منع أو السماح بالوصول حسب صلاحيات المستخدم.

تقليل استهلاك الموارد:
يتم إنشاء الكائن الحقيقي فقط عند الحاجة.

إضافة وظائف بدون تعديل الكائن الأصلي:
يمكن إضافة تسجيل، تحقق، أو مراقبة أداء.

تعزيز الأمان:
يساعد في تطبيق سياسات الأمان بسهولة.

عيوب Proxy Design Pattern


زيادة التعقيد:
يتطلب إنشاء كائنات إضافية لكل كائن حقيقي.

احتمالية ضعف الأداء:
إذا كان الوكيل يحتوي على تحقق مكثف في كل استدعاء.

صعوبة الصيانة في المشاريع الضخمة:
تعدد الوكلاء قد يجعل تتبع التنفيذ أكثر تعقيدًا.

تشبيه لفهم Proxy Design Pattern بسهولة


تخيل أنك تستخدم خادم Proxy لتصفح الإنترنت. أنت ترسل طلبك إلى البروكسي، وهو بدوره يتولى إرسال الطلب الحقيقي واستلام النتيجة ثم إعادتها لك.
أنت لا ترى التعقيدات الداخلية، بل تتعامل فقط مع الوسيط.
بنفس الطريقة يعمل Proxy Design Pattern، حيث يستقبل الطلب وينفذ كل التعقيدات داخله قبل تمريره للكائن الحقيقي.

الخلاصة


يُعد Proxy Design Pattern من أهم الأنماط الهيكلية التي تساعد على التحكم في الوصول وتحسين الأداء وتعزيز الأمان في التطبيقات.
عند بناء أنظمة كبيرة مثل أنظمة المدفوعات الإلكترونية أو الأنظمة البنكية، يصبح استخدام نمط الوكيل خيارًا احترافيًا لتطبيق مبادئ SOLID والحفاظ على نظافة الكود.
إذا كنت مطور Java أو تعمل على أنظمة حساسة تتطلب تحكمًا إضافيًا، فإن Proxy Pattern يعد أداة قوية في صندوق أدواتك البرمجية.

اذا كنت مهتم في انواع Design Pattern يمكنك الاطلاع ايضا علي شرح Singleton Design Pattern بالتفصيل مع مثال توضيحي ومعرفة العيوب والمميزات
رابط المقال
شاهد أيضًا
مقالات ذات صلة
شرح Single Responsibility Principle في مبادئ ال Solid لكتابة كود منظم

شرح Single Responsibility Principle في مبادئ ال Solid لكتابة كود منظم ربما تكون قد سمعت…

كود برنامج برولوج لحساب مضروب الرقم – prolog code to calc Factorial the number

  لغة prolog هي لغة more complex وليس الجيمع يستطيع تعلمها بسهوله بل تحتاج منك…

تحويل كل حرف الى رقم وبالتالي تحويل الكلمه كامله في بايثون

 تحويل كل حرف الى رقم وبالتالي تحويل الكلمه كامله في بايثونفي هذا الدرس سوف نشارك…

🚫 مانع الإعلانات مفعل

يجب إيقاف مانع الإعلانات لاستكمال تصفح الموقع