شارك المقالة
شرح Strategy Design Pattern بالتفصيل مع مثال عملي في Java

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

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


إذا كنت ترغب في بناء كود مرن يسمح لك بتغيير طريقة تنفيذ العمليات بدون تعديل الكود الأساسي، فإن Strategy Design Pattern هو أحد أفضل الحلول التي يمكنك استخدامها.

يُعتبر هذا النمط من أنماط التصميم السلوكية (Behavioral Design Patterns)، ويُستخدم بشكل واسع في الأنظمة التي تحتوي على أكثر من طريقة لتنفيذ نفس العملية.

ببساطة، هذا النمط يساعدك على فصل الخوارزميات (Algorithms) عن الكود الرئيسي، مما يجعل التطبيق أكثر مرونة وقابلية للتطوير.

ما هو Strategy Design Pattern؟

نمط Strategy Design Pattern هو نمط تصميم يسمح لك بتعريف مجموعة من الخوارزميات المختلفة، ووضع كل خوارزمية داخل كلاس مستقل، ثم جعل هذه الخوارزميات قابلة للتبديل أثناء التشغيل (Runtime).

بدلاً من استخدام if/else أو switch لتحديد السلوك، يتم استخدام Interface موحد يحتوي على السلوك العام، ويتم تنفيذ هذا السلوك بطرق مختلفة.

هذا النمط يعتمد على مبدأ Composition over Inheritance، أي الاعتماد على التركيب بدلاً من الوراثة.

فكرة النمط بطريقة بسيطة

تخيل أن لديك نظام دفع (Payment System):

– الدفع بالبطاقة (Credit Card) – الدفع عبر PayPal – الدفع نقدًا

جميعها تقوم بنفس العملية (الدفع)، لكن بطريقة مختلفة.

هنا يأتي دور Strategy Design Pattern لتنظيم هذه الاختلافات بشكل احترافي.

مثال بدون استخدام Strategy Design Pattern

في الطريقة التقليدية يتم استخدام شروط:

public class WithoutStrategyExample {
    public static void main(String[] args) {
        String paymentMethod = "CreditCard";
        int amount = 100;

        if (paymentMethod.equals("CreditCard")) {
            System.out.println("Paid " + amount + " using Credit Card");
        } else if (paymentMethod.equals("PayPal")) {
            System.out.println("Paid " + amount + " using PayPal");
        }
    }
}

مشاكل الطريقة التقليدية

– زيادة الشروط مع كل إضافة جديدة – صعوبة الصيانة – كود غير مرن

مثال باستخدام Strategy Design Pattern

نقوم بفصل كل طريقة دفع في كلاس مستقل:

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

// Credit Card Strategy
class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;

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

    public void pay(int amount) {
        System.out.println("Paid " + amount + " using Credit Card: " + cardNumber);
    }
}

// PayPal Strategy
class PayPalPayment implements PaymentStrategy {
    private String email;

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

    public void pay(int amount) {
        System.out.println("Paid " + amount + " using PayPal: " + email);
    }
}

// Context
class ShoppingCart {
    private PaymentStrategy paymentStrategy;

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

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

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

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

        cart.setPaymentStrategy(new PayPalPayment("user@example.com"));
        cart.checkout(250);
    }
}

شرح كيف يعمل Strategy Pattern

– إنشاء Interface يحتوي على العملية الأساسية (pay) – إنشاء Class لكل استراتيجية (CreditCard – PayPal) – إنشاء Context (مثل ShoppingCart) – تغيير الاستراتيجية أثناء التشغيل باستخدام setStrategy

بهذا الشكل يمكن تغيير السلوك بسهولة بدون تعديل الكود الأساسي.

الفرق بين الطريقتين

المرونة
Strategy Pattern يسمح بتغيير السلوك بسهولة.

قابلية التوسع
يمكن إضافة استراتيجيات جديدة بدون تعديل الكود.

تنظيم الكود
كل خوارزمية في كلاس منفصل.

مميزات Strategy Design Pattern

مرونة عالية
تغيير السلوك أثناء التشغيل بسهولة.

فصل المنطق
كل خوارزمية منفصلة عن الأخرى.

إعادة الاستخدام
يمكن استخدام نفس الاستراتيجية في أكثر من مكان.

سهولة التوسع
إضافة استراتيجيات جديدة بسهولة.

عيوب Strategy Design Pattern

تعقيد إضافي
قد يكون غير ضروري في الحالات البسيطة.

عدد كبير من الكلاسات
كل استراتيجية تحتاج كلاس منفصل.

متى تستخدم Strategy Design Pattern؟

– عند وجود أكثر من طريقة لتنفيذ نفس العملية – عند الحاجة لتغيير السلوك أثناء التشغيل – عند الرغبة في كتابة كود مرن وقابل للتوسع – عند تطبيق مبادئ Clean Architecture

أفضل استخدامات النمط

– أنظمة الدفع – أنظمة التوصيل (Shipping Methods) – أنظمة الفلترة والبحث – الألعاب (AI Behaviors) – الأنظمة المعتمدة على خوارزميات متعددة

الخلاصة

يُعد Strategy Design Pattern من أقوى الأنماط التي تساعدك على كتابة كود مرن وقابل للتطوير.

بدلاً من استخدام if/else، يمكنك فصل كل سلوك في كلاس مستقل، مما يجعل الكود أكثر وضوحًا وسهولة في الصيانة.

ورغم أنه يزيد عدد الكلاسات، إلا أنه يوفر تحكمًا كبيرًا في سلوك التطبيق.

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

مثل: عملية الدفع تختلف حسب الوسيلة، لكن الهدف النهائي واحد.

لمزيد من المقالات يمكنك مشاهده : كيفيةإزالة MySQL من macOS خطوة بخطوة بدون ترك أي بقايا
شاهد أيضًا
مقالات ذات صلة
الحصول على كود يمكنك دفع من اي مكينة فوري من خلال paymob

الحصول على كود يمكنك دفع من اي مكينة فوري من خلال paymob عندما ترغب بوضع…

إنشاء تصميم DrawerLayout بشكل مخصص في الاندرويد ستوديو

 إنشاء تصميم DrawerLayout بشكل مخصص في الاندرويد ستوديونحتاج الى DrawerLayout في اغلب المشاريع التي نعمل…

اكتب برنامج بايثون python للحصول على سلسلة فيبوناتشي Fibonacci بين 0 و 100

الحصول على سلسلة فيبوناتشي Fibonacci بالبايثون زوارنا الاعزاء مرحبا بكم في مقالة python جديدة واليوم سوف…

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

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