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

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

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


إذا كنت تعاني من كثرة الشروط (if / else) في الكود وتبحث عن طريقة لتنظيم منطق الحالات بشكل احترافي، فإن State Design Pattern هو الحل المثالي.

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

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

ما هو State Design Pattern؟

نمط State Design Pattern هو نمط تصميم يسمح للكائن بتغيير سلوكه عندما تتغير حالته الداخلية، بحيث يبدو وكأنه غيّر الكلاس الخاص به.

بدلاً من استخدام شروط معقدة مثل if و switch، يتم تقسيم كل حالة إلى كلاس مستقل يحتوي على السلوك الخاص بها.

هذا النمط يعتمد على مبدأ Encapsulation وPolymorphism، مما يجعل الكود أكثر تنظيمًا وقابلية للصيانة.

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

تخيل أنك تبني نظام طلبات (Order System)، والحالات هي:

– Pending (قيد المعالجة) – Paid (تم الدفع) – Cancelled (ملغي)

كل حالة لها سلوك مختلف، وهنا يأتي دور State Design Pattern لتنظيم هذا السلوك بطريقة نظيفة.

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

في الطريقة التقليدية يتم استخدام if/else:

public class Order {
    private String state;

    public Order() {
        this.state = "Pending";
    }

    public void pay() {
        if ("Pending".equals(state)) {
            state = "Paid";
            System.out.println("Order paid.");
        } else if ("Paid".equals(state)) {
            System.out.println("Order is already paid.");
        } else if ("Cancelled".equals(state)) {
            System.out.println("Cannot pay for a cancelled order.");
        }
    }

    public void cancel() {
        if ("Pending".equals(state)) {
            state = "Cancelled";
            System.out.println("Order cancelled.");
        } else if ("Paid".equals(state)) {
            System.out.println("Cannot cancel a paid order.");
        } else if ("Cancelled".equals(state)) {
            System.out.println("Order is already cancelled.");
        }
    }
}

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

– كثرة الشروط (if/else) – صعوبة التوسع وإضافة حالات جديدة – كود غير نظيف ويصعب صيانته

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

هنا نقوم بتقسيم كل حالة إلى كلاس مستقل:

interface OrderState {
    void pay(OrderContext context);
    void cancel(OrderContext context);
}

class PendingState implements OrderState {
    public void pay(OrderContext context) {
        context.setState(new PaidState());
        System.out.println("Order paid.");
    }

    public void cancel(OrderContext context) {
        context.setState(new CancelledState());
        System.out.println("Order cancelled.");
    }
}

class PaidState implements OrderState {
    public void pay(OrderContext context) {
        System.out.println("Order is already paid.");
    }

    public void cancel(OrderContext context) {
        System.out.println("Cannot cancel a paid order.");
    }
}

class CancelledState implements OrderState {
    public void pay(OrderContext context) {
        System.out.println("Cannot pay for a cancelled order.");
    }

    public void cancel(OrderContext context) {
        System.out.println("Order is already cancelled.");
    }
}

class OrderContext {
    private OrderState state;

    public OrderContext() {
        this.state = new PendingState();
    }

    public void setState(OrderState state) {
        this.state = state;
    }

    public void pay() {
        state.pay(this);
    }

    public void cancel() {
        state.cancel(this);
    }
}

شرح كيف يعمل State Design Pattern

– نقوم بإنشاء Interface يحتوي على العمليات (مثل pay و cancel) – نقوم بإنشاء Class لكل حالة (Pending, Paid, Cancelled) – كل كلاس يحتوي على السلوك الخاص به – نستخدم Context لإدارة الحالة الحالية – عند تغيير الحالة يتم تغيير الكائن الحالي

بهذا الشكل يتم التخلص من التعقيد الناتج عن الشروط المتداخلة.

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

تنظيم الكود
State Pattern يجعل الكود منظمًا وواضحًا.

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

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

مميزات State Design Pattern

تقليل التعقيد
يقلل من استخدام if/else بشكل كبير.

كود نظيف (Clean Code)
كل حالة في كلاس منفصل.

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

مرونة عالية
تغيير السلوك أثناء التشغيل (Runtime).

عيوب State Design Pattern

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

تعقيد إضافي
قد يكون مبالغًا فيه في المشاريع الصغيرة.

زيادة حجم المشروع
بسبب تعدد الكلاسات.

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

– عند وجود حالات متعددة لكائن واحد – عند وجود شروط معقدة (if / switch) – عند الحاجة لتغيير السلوك أثناء التشغيل – في الأنظمة المعتمدة على الحالات (State Machines)

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

– أنظمة الطلبات (Order Systems) – أنظمة الدفع الإلكتروني – الألعاب (Game States) – أنظمة الحجز – Workflow Systems

الخلاصة

يُعتبر State Design Pattern من أقوى أنماط التصميم التي تساعدك على إدارة الحالات بشكل احترافي.

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

ورغم أنه يزيد عدد الكلاسات، إلا أنه يوفر مرونة كبيرة خاصة في المشاريع الكبيرة.

ببساطة: إذا وجدت نفسك تكتب الكثير من if/else، فغالبًا أنت بحاجة لاستخدام هذا النمط.

هذا النمط هو الحل المثالي لتحويل كود معقد إلى كود نظيف وسهل التطوير.


لمزيد من المقالات : أسباب مشكلة Hot Reload في Flutter ولماذا لا يعمل؟ الدليل الشامل للحل
شاهد أيضًا
مقالات ذات صلة
تصميم صفحة لعرض المنتج وعمل انميشن على المنتج وتغيير اللون والسعر في Flutter

تصميم صفحة لعرض المنتج وعمل انميشن على المنتج وتغيير اللون والسعر في Flutterفي هذا القسم…

كيفية اضافة امكانية لعرض النص كامل او جزء منه في فلاتر Show more – Show less Text

كيفية اضافة امكانية لعرض النص كامل او جزء منه في فلاتر Show more – Show…

شرح كيفية ربط مشروع Flutter بـ CLI مع حل جميع المشاكل التي تقابلك بابسط طريقة

 شرح كيفية ربط مشروع Flutter بـ CLI مع حل جميع المشاكل التي تقابلك بابسط طريقة…

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

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