مقدمة في أنماط التصميم
جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 64 من 87.
أنماط التصميم هي حلول مُثبتة لمشكلات شائعة يواجهها المطورون مرارًا عند بناء البرمجيات. وبدلًا من إعادة اختراع العجلة في كل مرة، يمكنك تطبيق هذه القوالب المُجرّبة عبر الزمن لحل تحديات التصميم المتكررة.
فكّر في design patterns على أنها مخططات. فهي لا تمنحك code مكتملًا لتنسخه وتلصقه، بل تصف كيفية تنظيم classes وobjects لحل نوع محدد من المشكلات. تستفيد patterns التي ستتعلّمها من مفاهيم OOP التي أتقنتها بالفعل: الوراثة، وinterfaces، وتعدد الأشكال، والتركيب.
تنقسم Design patterns إلى ثلاث فئات رئيسية:
| Category | الغرض | أمثلة |
|---|---|---|
| Creational | How objects are created | Singleton، Factory، Builder |
| Structural | How objects are composed | Adapter، Decorator، Composite |
| Behavioral | How objects communicate | Observer، Strategy، Command |
لماذا تتعلم أنماط التصميم؟ إنها تمنحك مفردات مشتركة مع المطورين الآخرين: فعندما تقول "استخدم Factory هنا"، فإنك توصل فكرة معقدة على الفور. كما أنها تساعدك على كتابة code أكثر مرونة وقابلية للصيانة من خلال تطبيق مبادئ مثل "برمج وفقًا لـ interface، وليس وفقًا لتطبيق."
في الدروس القادمة، ستقوم بتنفيذ العديد من patterns الأساسية، بدءًا من الأنماط الإنشائية مثل Singleton وFactory، ثم الانتقال إلى patterns السلوكية مثل Observer وStrategy.
التحدي
سهللنَبْنِ مُصنِّفًا بسيطًا للأنماط يوضّح فهمك للفئات الثلاث لأنماط التصميم! ستنشئ نظامًا يصنّف الأنماط ويشرح الغرض منها، مع تنظيم الشيفرة عبر ملفات متعددة.
ستنشئ ثلاثة ملفات:
Pattern.java: Create واجهة تُسمّىPatternوتحدّد العقد لجميع أنماط التصميم. يجب أن تعلن واجهتك عن methodَين:String getCategory()اللذان يعيدان فئة النمط (Creational أو Structural أو Behavioral)، وString getPurpose()اللذان يعيدان وصفًا لما تفعله تلك الفئة من الأنماط.PatternInfo.java: Create ثلاث classes تُنفّذ واجهةPatternالخاصة بك، بحيث تمثّل كلٌّ منها فئةً واحدة من أنماط التصميم:CreationalPattern- يجب أن يعيد"Creational"للفئة و"How objects are created"للغرض.StructuralPattern- يجب أن يعيد"Structural"للفئة و"How objects are composed"للغرض.BehavioralPattern- يجب أن يعيد"Behavioral"للفئة و"How objects communicate"للغرض.Main.java: اجمع مُصنِّف الأنماط الخاص بك! ستتلقى input واحدًا: اسم نمط (String) سيكون واحدًا من"Singleton"أو"Factory"أو"Adapter"أو"Decorator"أو"Observer"أو"Strategy".بناءً على input، أنشئ pattern object appropriate:
"Singleton"و"Factory"هما نمطا Creational"Adapter"و"Decorator"هما نمطا Structural"Observer"و"Strategy"هما نمطا Behavioral
خزّن pattern object في variable من النوع
Pattern(الواجهة)، موضّحًا مبدأ البرمجة على واجهة. ثم اطبع الأسطر الثلاثة following:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
ستتلقى input واحدًا: اسم نمط تصميم (String).
يعزّز هذا التحدي الفكرة الأساسية من الدرس: تُنظَّم أنماط التصميم في فئات بناءً على المشكلة التي تحلّها. ومن خلال استخدام واجهة، فإنك تتدرّب أيضًا على مبدأ «البرمجة على واجهة، وليس على تنفيذ» - وهو مفهوم أساسي يجعل أنماط التصميم قوية إلى هذا الحد!
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: أعلن عن متغير من النوع Pattern (الواجهة)
Pattern pattern = null;
// TODO: بناءً على patternName، أنشئ كائن النمط المناسب:
// - "Singleton" و "Factory" هما أنماط إنشائية (Creational)
// - "Adapter" و "Decorator" هما أنماط هيكلية (Structural)
// - "Observer" و "Strategy" هما أنماط سلوكية (Behavioral)
// TODO: اطبع المخرجات بالتنسيق التالي:
// Pattern: [اسم النمط المدخل]
// Category: [الفئة من getCategory()]
// Purpose: [الغرض من getPurpose()]
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP
الملفات الخارجيةمقدمة في الـ OOPالفئات (Classes) مقابل الكائنات (Objects)الكلمة المفتاحية thisالدوال (Methods)الحقول (Attributes)دالة البناء (Constructor)تعدد أشكال دالة البناء (Constructor Overloading)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسية (extends)الكلمة المفتاحية superإعادة تعريف الدوال (@Override)تسلسل المنشئات (Constructor Chaining)كلاس Objectالوراثة الأحادية ومتعددة المستوياتلماذا لا توجد وراثة متعددة للكلاساتمراجعة - هيكلية الموظفين7الدوال الخاصة وفئة Object
دالة toString()equals() و hashCode()دالة clone()compareTo() و Comparableواجهة Comparatorمراجعة - الترتيب المخصص2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال Getter و Setterإخفاء البياناتالكلمة المفتاحية finalمراجعة - مدير الحساب البنكي5تعدد الأشكال (Polymorphism)
أساسيات الـ Method Overloadingالـ Method Overriding (في وقت التشغيل)الـ Upcasting والـ Downcastingمعامل الـ instanceofالفئات والدوال المجردة (Abstract)مراجعة - حاسبة الأشكال8مفاهيم OOP المتقدمة
الـ Composition مقابل الـ Inheritanceالـ Aggregation مقابل الـ Compositionالفئات الداخلية والمتداخلة والمجهولة (Inner, Nested & Anonymous)الـ Enums ودوالهاالـ Records (Java 16+)الـ Sealed Classes (Java 17+)11أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Builderنمط Observerنمط Strategy3خصائص الفئة والعضو الساكن
المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنةالدوال الساكنةالكتل البرمجية الساكنةالثوابت (static final)ملخص - العداد والأدوات المساعدة6الواجهات (Interfaces) والأصناف المجردة (Abstract Classes)
مقدمة في الواجهات (Interfaces)تنفيذ الواجهات (Interfaces)تنفيذ واجهات متعددةالـ Default و Static في الواجهاتالأصناف المجردة مقابل الواجهاتالواجهات الوظيفية (Functional Interfaces)مراجعة - نظام الدفع9الأنواع العامة (Generics)
مقدمة في الأنواع العامةالأصناف العامة (Generic Classes)الدوال العامة (Generic Methods)معاملات الأنواع المقيدةالرموز البديلة (?, extends, super)مراجعة - الحاويات العامة12أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكررتدرّب بنفسك: مترجم Java عبر الإنترنت