"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > فهم نمط تصميم الاستراتيجية في جافا

فهم نمط تصميم الاستراتيجية في جافا

تم النشر بتاريخ 2024-08-21
تصفح:125

Understanding the Strategy Design Pattern in Java

فهم نمط تصميم الاستراتيجية في جافا

مشكلة

يعالج نمط الإستراتيجية الحاجة إلى تحديد مجموعة من الخوارزميات، وتغليف كل واحدة منها، وجعلها قابلة للتبديل. يتيح هذا النمط للخوارزمية أن تختلف بشكل مستقل عن العملاء الذين يستخدمونها. يكون ذلك مفيدًا عندما يكون لديك طرق متعددة لأداء مهمة معينة وترغب في اختيار الخوارزمية في وقت التشغيل.

حل

يتضمن نمط الإستراتيجية ثلاثة مكونات رئيسية:

  1. السياق: الكائن الذي يحتوي على مرجع لكائن الإستراتيجية ويستخدمه لتنفيذ الخوارزمية.
  2. الاستراتيجية: واجهة مشتركة لجميع الخوارزميات المدعومة. يستخدم السياق هذه الواجهة لاستدعاء الخوارزمية المحددة باستراتيجية محددة.
  3. الإستراتيجية الملموسة: الفئات التي تنفذ واجهة الإستراتيجية، وتوفر خوارزميات محددة.

يفوض السياق تنفيذ الخوارزمية إلى كائن الإستراتيجية، مما يسمح بتحديد الخوارزمية في وقت التشغيل.

إيجابيات وسلبيات

الايجابيات

  • تغليف الخوارزميات: يتم تغليف كل خوارزمية في فئتها الخاصة، مما يجعل من السهل التبديل بينها وإضافة خوارزميات جديدة دون تغيير السياق.
  • مبدأ المسؤولية الفردية: تم تبسيط فئة السياق لأنها تفوض تنفيذ الخوارزمية إلى فئات الإستراتيجية.
  • المبدأ المفتوح/المغلق: يمكن تقديم استراتيجيات جديدة دون تغيير السياق الحالي أو فئات الإستراتيجية.

سلبيات

  • زيادة عدد الفئات: يزيد النمط من عدد الفئات في قاعدة التعليمات البرمجية بسبب إنشاء فئات إستراتيجية جديدة لكل خوارزمية.
  • التعقيد في تبديل الاستراتيجيات: إذا لم تتم إدارته بشكل جيد، فإن تبديل الاستراتيجيات ديناميكيًا في وقت التشغيل يمكن أن يؤدي إلى تعقيد وأخطاء محتملة.

مثال لتطبيق العالم الحقيقي

من الأمثلة العملية لنمط الإستراتيجية هو نظام معالجة الدفع حيث يتم تنفيذ طرق دفع مختلفة (على سبيل المثال، بطاقة الائتمان، PayPal، التحويل المصرفي) كاستراتيجيات مختلفة. يمكن للعميل اختيار استراتيجية الدفع المناسبة في وقت التشغيل.

رمز المثال في جافا

نمط الإستراتيجية في الكود:

java
// Strategy Interface
public interface PaymentStrategy {
    void pay(int amount);
}

// Concrete Strategy 1
public class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;

    public CreditCardPayment(String cardNumber) {
        this.cardNumber = cardNumber;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount   " paid with credit card "   cardNumber);
    }
}

// Concrete Strategy 2
public class PayPalPayment implements PaymentStrategy {
    private String email;

    public PayPalPayment(String email) {
        this.email = email;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount   " paid using PayPal account "   email);
    }
}

// Context
public class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(int amount) {
        paymentStrategy.pay(amount);
    }
}

// Client code
public class Client {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9876-5432"));
        cart.checkout(100);

        cart.setPaymentStrategy(new PayPalPayment("[email protected]"));
        cart.checkout(200);
    }
}
بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/diegosilva13/understanding-the-strategy-design-pattern-in-java-3ah4?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3