المقدمة
نماذج التصميم شائعة جدًا بين مطوري البرمجيات. نمط التصميم هو حلاً موثوقًا به لمشكلة برمجية شائعة.
بعض فوائد استخدام نماذج التصميم هي:
- النماذج التصميمية معرفة بالفعل وتوفر نهجًا قياسيًا صناعيًا لحل مشكلة تكرارية، لذلك يوفر الوقت إذا استخدمنا نمط التصميم بحكمة. هناك العديد من نماذج التصميم في جافا التي يمكننا استخدامها في مشاريعنا القائمة على جافا.
- استخدام نماذج التصميم يعزز إعادة الاستخدام مما يؤدي إلى كود أكثر صلابة وقابلية للصيانة. يساعد في تقليل التكلفة الإجمالية للملكية (TCO) لمنتج البرمجيات.
- نظرًا لأن النماذج التصميمية معرفة بالفعل، فإنها تجعل كودنا سهل الفهم والتصحيح. يؤدي إلى تطوير أسرع ويفهمه أعضاء الفريق الجدد بسهولة.
تنقسم نماذج التصميم في جافا إلى ثلاث فئات – الإنشائية، الهيكلية، والسلوكية.
تعمل هذه المقالة كفهرس لجميع مقالات نمط تصميم جافا.
نماذج التصميم الإنشائية
تقديم أنماط التصميم الإبداعية حلاً لتكوين كائن Object
بأفضل طريقة ممكنة لحالات معينة.
1. نمط الفرد (Singleton Pattern)
يقيد نمط الفرد تكوين Class
ويضمن أن يكون هناك فقط مثيل واحد للفئة في الآلة الافتراضية لجافا. كان تنفيذ نمط الفرد دائمًا موضوعًا مثيرًا للجدل بين المطورين.
ملاحظة: اعرف المزيد حول نمط تصميم الفرد (Singleton Design Pattern).
2. نمط المصنع (Factory Pattern)
يتم استخدام نمط تصميم المصنع عندما يكون لدينا فئة أم بعدة فئات فرعية وبناءً على الإدخال، نحتاج إلى إرجاع إحدى الفئات الفرعية. يأخذ هذا النمط مسؤولية تكوين Class
من البرنامج العميل إلى فئة المصنع. يمكننا تطبيق نمط الفرد على فئة المصنع أو جعل طريقة المصنع static
.
ملاحظة: اعرف المزيد حول نمط تصميم المصنع (Factory Design Pattern).
نمط المصنع المجرد
نمط المصنع المجرد مشابه لنمط المصنع وهو مصنع للمصانع. إذا كنت ملمًا بنمط تصميم المصنع في جافا، ستلاحظ أن لدينا فئة مصنع واحدة تُرجع الفئات الفرعية المختلفة بناءً على الإدخال المُقدم وتستخدم الفئة المصنعة تعليمات if-else
أو switch
لتحقيق ذلك. في نمط المصنع المجرد، نتخلص من كتلة if-else
ولدينا فئة مصنع لكل فئة فرعية ثم فئة مصنع مجردة ستُرجع الفئة الفرعية بناءً على فئة المصنع المدخلة.
ملاحظة: تعرف على المزيد حول نمط المصنع المجرد.
نمط البنّاء
تم تقديم نمط البنّاء لحل بعض المشاكل مع أنماط تصميم المصنع والمصنع المجرد عندما يحتوي الكائن على العديد من السمات. يُحل هذا النمط المشكلة مع عدد كبير من المعلمات الاختيارية والحالة غير المتسقة عن طريق توفير طريقة لبناء الكائن خطوة بخطوة وتوفير طريقة سترجع فعليًا الكائن النهائي Object
.
ملاحظة: تعرف المزيد حول نمط البناء.
5. نمط النموذج الأولي
يُستخدم نمط النموذج الأولي عندما يكون إنشاء الكائن كلفة مرتفعة ويتطلب الكثير من الوقت والموارد، وتكون لديك كائن مماثل موجود بالفعل. لذلك، يوفر هذا النمط آلية لنسخ الكائن الأصلي إلى كائن جديد ثم تعديله وفقًا لاحتياجاتنا. يستخدم هذا النمط تكرار Java لنسخ الكائن. يُلزم نمط تصميم النموذج الأولي الكائن الذي تقوم بنسخه بتوفير ميزة النسخ. لا يجب أن يتم ذلك بواسطة أي فئة أخرى. ومع ذلك، ما إذا كان يجب استخدام نسخة ضحلة أو عميقة من خصائص الكائن يعتمد على المتطلبات وهو قرار تصميمي.
ملاحظة: تعرف المزيد حول نمط النموذج الأولي.
أنماط التصميم الهيكلية
تقدم أنماط التصميم الهيكلية طرقًا مختلفة لإنشاء هيكل Class
(على سبيل المثال، باستخدام التوريث والتكوين لإنشاء Object
كبير من Object
صغيرة).
1. نمط المحول
نمط المحول هو أحد أنماط التصميم الهيكلية ويستخدم حتى يمكن لواجهتين غير مترابطتين أن تعملا معًا. يُطلق على الكائن الذي يربط هذه الواجهات غير المترابطة اسم محول.
ملاحظة: تعرف على المزيد حول نمط المحول.
2. نمط المركب
يُستخدم نمط المركب عندما يتعين علينا تمثيل التسلسل الهرمي للجزء والكل. عندما نحتاج إلى إنشاء هيكل بطريقة يجب فيها أن تُعامَل الكائنات في الهيكل بنفس الطريقة، يمكننا تطبيق نمط التصميم المركب.
ملاحظة: تعرف على المزيد حول نمط المركب.
نمط الوكيل
يوفر نمط الوكيل مكانًا لـ Object
آخر للتحكم في الوصول إليه. يُستخدم هذا النمط عندما نريد توفير وصول مُتحكم فيه إلى الوظائف.
ملحوظة: تعرف أكثر على نمط الوكيل.
نمط الوزن الخفيف
يُستخدم نمط التصميم الخفيف الوزن عندما نحتاج إلى إنشاء العديد من Object
s لـ Class
. نظرًا لأن كل Object
يستهلك مساحة في الذاكرة يمكن أن تكون حاسمة بالنسبة للأجهزة ذات الذاكرة المنخفضة (مثل الأجهزة المحمولة أو أنظمة الإدخال المضمنة)، يمكن تطبيق نمط التصميم الخفيف الوزن لتقليل الضغط على الذاكرة من خلال مشاركة Object
s.
تنفيذ حمام السباحة في جافا هو واحد من أفضل الأمثلة على تنفيذ نمط الوزن الخفيف.
ملحوظة: تعرف أكثر على نمط الوزن الخفيف.
نمط الواجهة
يتم استخدام نمط الواجهة لمساعدة تطبيقات العملاء في التفاعل بسهولة مع النظام.
ملحوظة: تعرف أكثر عن نمط الواجهة.
نمط الجسر
عند وجود تسلسل واجهات في كل من الواجهات والتنفيذات، يتم استخدام نمط تصميم الجسر لفصل الواجهات عن التنفيذ وإخفاء تفاصيل التنفيذ عن برامج العميل. يتبع تنفيذ نمط تصميم الجسر مفهوم تفضيل التركيب على التوريث.
ملحوظة: تعرف أكثر عن نمط الجسر.
نمط المزين
يُستخدم نمط تصميم المزين (Decorator Design Pattern) لتعديل وظائف كائن في وقت التشغيل، في حين لن تتأثر باقي حالات الفئة نفسها بهذا التعديل، بحيث يحصل الكائن الفردي على السلوك المعدل. يُعد نمط تصميم المزين واحدًا من أنماط التصميم الهيكلية (مثل نمط محول الواجهة، ونمط الجسر، ونمط المركب)، ويستخدم الفئات المجردة أو الواجهات مع التركيب لتنفيذه. نستخدم التوريث أو التركيب لتوسيع سلوك كائن، ولكن يتم ذلك في وقت الترجمة، وينطبق على جميع حالات الفئة. لا يمكننا إضافة أي وظيفة جديدة أو إزالة أي سلوك موجود في وقت التشغيل – هذا هو الوقت الذي يكون فيه نمط المزين مفيدًا.
ملاحظة: تعرف أكثر عن نمط المزين.
أنماط التصميم السلوكية
توفر أنماط التصميم السلوكية حلاً للتفاعل الأفضل بين الكائنات وكيفية توفير الارتباط الضعيف والمرونة في التوسع.
1. نمط طريقة القالب
نمط القالب الميثود هو نمط تصميم سلوكي ويستخدم لإنشاء واجهة طريقة فارغة وتأجيل بعض خطوات التنفيذ للفصول الفرعية. يحدد القالب الميثود الخطوات لتنفيذ خوارزمية، ويمكن أن يوفر تنفيذاً افتراضياً قد يكون مشتركًا لكل الفصول الفرعية أو بعضها.
ملاحظة: تعرف المزيد عن نمط القالب الميثود.
2. نمط الوسيط
يستخدم نمط التصميم الوسيط لتوفير وسيط اتصال مركزي بين كائنات مختلفة في النظام. إذا تفاعلت الكائنات مع بعضها مباشرة، فإن مكونات النظام ترتبط بشكل قوي ببعضها البعض مما يجعل تكلفة الصيانة أعلى وعدم المرونة في التوسع. يركز نمط الوسيط على توفير وسيط بين الكائنات للتواصل وتنفيذ ربط فضفاض بين الكائنات. يعمل الوسيط كموجه بين الكائنات، ويمكن أن يحتوي على منطقه الخاص لتوفير وسيلة للتواصل.
ملاحظة: تعرف المزيد عن نمط الوسيط.
نمط سلسلة المسؤولية 3.
يتم استخدام نمط سلسلة المسؤولية لتحقيق ارتباط فضفاض في تصميم البرمجيات حيث يتم تمرير طلب من العميل إلى سلسلة من الكائنات لمعالجتها. ثم يقرر الكائن في السلسلة من سيقوم بمعالجة الطلب وما إذا كان يتعين إرسال الطلب إلى الكائن التالي في السلسلة أم لا.
نعلم أنه يمكننا أن نملك العديد من كتل catch
في كود الكتلة try-catch
. حيث تكون كل كتلة catch
نوعًا من المعالج لمعالجة هذا الاستثناء الخاص. لذا عند حدوث استثناء في كتلة try
، يتم إرساله إلى الكتلة الأولى catch
ليتم معالجته. إذا لم تكن كتلة catch
قادرة على معالجته، فإنها تحول الطلب إلى الكائن التالي في السلسلة (أي الكتلة التالية catch
). إذا كانت حتى الكتلة catch
الأخيرة غير قادرة على معالجته، يتم رمي الاستثناء خارج السلسلة إلى البرنامج الذي قام بالاستدعاء.
ملاحظة: تعرف أكثر عن نمط سلسلة المسؤولية.
نمط المراقب 4.
نمط التصميم المراقب مفيد عندما تكون مهتمًا بحالة الكائن
وترغب في الحصول على إشعار كلما حدث أي تغيير. في نمط المراقب، الكائن
الذي يراقب حالة كائن
آخر يسمى بالمراقب، والكائن
الذي يتم مراقبته يسمى بالموضوع.
توفر جافا منصة مدمجة لتنفيذ نمط المراقب من خلال فئة java.util.Observable
وواجهة java.util.Observer
. ومع ذلك، لا يتم استخدامها على نطاق واسع لأن التنفيذ محدود وفي معظم الأحيان لا نريد أن ننتهي بتوسيع فئة فقط لتنفيذ نمط المراقب حيث أن جافا لا توفر التوريث المتعدد في الفئات. يستخدم خدمة رسائل جافا (JMS) نمط المراقب بالإضافة إلى نمط الوسيط للسماح للتطبيقات بالاشتراك ونشر البيانات إلى التطبيقات الأخرى.
ملاحظة: تعرف على المزيد حول نمط المراقب.
5. نمط الاستراتيجية
يتم استخدام نمط الاستراتيجية عندما لدينا العديد من الخوارزميات لمهمة محددة، والعميل يقرر التنفيذ الفعلي الذي سيتم استخدامه في وقت التشغيل. نمط الاستراتيجية معروف أيضًا باسم نمط السياسة. نحن نحدد العديد من الخوارزميات ونتيح لتطبيقات العميل تمرير الخوارزمية التي ستستخدم كمعلمة.
واحدة من أفضل الأمثلة على هذا النمط هي طريقة Collections.sort()
التي تأخذ معلمة Comparator. استنادًا إلى التنفيذات المختلفة لواجهات المقارنة، يتم فرز الكائنات بطرق مختلفة.
ملاحظة: تعرف المزيد عن نمط الاستراتيجية.
6. نمط الأمر
يتم استخدام نمط الأمر لتنفيذ فصل فعال بين المكونات في نموذج الطلب والاستجابة. في هذا النمط، يتم إرسال الطلب إلى الـ مشغل ويمرره المشغل إلى كائن الأمر المغلف. يمر كائن الأمر بالطلب إلى الطريقة المناسبة لـ المستقبل لأداء الإجراء المحدد.
ملاحظة: تعرف المزيد عن نمط الأمر.
7. نمط الحالة
نمط التصميم الحالة يستخدم عندما يتغير السلوك الخاص بـ Object
استنادًا إلى حالته الداخلية. إذا كان علينا تغيير سلوك Object
استنادًا إلى حالته، يمكننا أن نضع متغير حالة في Object
ونستخدم كتلة if-else
لتنفيذ إجراءات مختلفة استنادًا إلى الحالة. يُستخدم نمط الحالة لتوفير طريقة منهجية ومرنة لتحقيق هذا الأمر من خلال تنفيذات السياق والحالة.
ملاحظة: تعرف على المزيد حول نمط الحالة.
8. نمط الزائر
يُستخدم نمط الزائر عندما يتعين علينا تنفيذ عملية على مجموعة من أنواع الكائنات المتشابهة. باستخدام نمط الزائر، يمكننا نقل منطق التشغيل من الكائنات إلى فئة أخرى.
ملاحظة: تعرف على المزيد حول نمط الزائر.
9. نمط المترجم
يُستخدم نمط المترجم لتحديد تمثيل لغوي للغة وتوفير مترجم للتعامل مع هذا القواعد اللغوية.
10. نمط المكرر
نمط المكرر هو أحد الأنماط السلوكية ويستخدم لتوفير طريقة قياسية للتجوال عبر مجموعة من الكائنات. يستخدم نمط المكرر على نطاق واسع في إطار عمل مجموعة جافا حيث يوفر واجهة المكرر طرقًا للتجوال عبر المجموعة
. يستخدم هذا النمط أيضًا لتوفير أنواع مختلفة من المكررات بناءً على متطلباتنا. يخفي نمط المكرر التنفيذ الفعلي للتجوال عبر المجموعة
وتستخدم البرامج العميلة طرق المكرر.
ملحوظة: تعرّف أكثر على نمط المكرر.
11. نمط المأخذ
نمط تصميم المأخذ يستخدم عندما نريد حفظ حالة كائن بحيث يمكننا استعادتها لاحقًا. يستخدم هذا النمط لتنفيذ ذلك بطريقة لا يمكن الوصول فيها إلى بيانات حالة الكائن المحفوظة خارج الكائن
، وهذا يحمي سلامة بيانات الحالة المحفوظة.
تُنفّذ نمط Memento بواسطة كائنين – المُنشئ (Originator) وحافظ الحالة (Caretaker). المُنشئ هو الكائن الذي يجب حفظ واستعادة حالته، ويستخدم فئة داخلية لحفظ حالة الكائن. تُسمى هذه الفئة الداخلية “Memento” وهي “خاصة” بحيث لا يمكن الوصول إليها من الكائنات الأخرى.
أنماط تصميم متنوعة
هناك العديد من أنماط التصميم التي لا تندرج ضمن مجموعة الأربعة الكبار. دعنا نلقي نظرة على بعض هذه الأنماط التصميم الشائعة.
1. نمط تصميم DAO
يُستخدم نمط تصميم واجهة الوصول إلى البيانات (DAO) لفصل منطق استمرارية البيانات إلى طبقة منفصلة. DAO هو نمط شائع جدًا عند تصميم أنظمة تعمل مع قواعد البيانات. الفكرة هي الحفاظ على طبقة الخدمة منفصلة عن طبقة وصول البيانات. وبهذه الطريقة نقوم بتنفيذ فصل المنطق في تطبيقنا.
ملاحظة: تعرف أكثر على نمط DAO.
2. نمط حقن التبعيات
يسمح نمط حقن التبعيات لنا بإزالة الاعتمادات المشفرة بشكل ثابت وجعل تطبيقنا منخرطًا بشكل فضفاض وقابل للتمديد والصيانة. يمكننا تنفيذ حقن التبعيات في جافا لنقل قرار الاعتماد من وقت الترجمة إلى وقت التشغيل. إطار العمل Spring مبني على مبدأ حقن التبعيات.
ملاحظة: تعرف أكثر على نمط حقن التبعيات.
3. نمط MVC
نمط النموذج-العرض-التحكم (MVC) هو واحد من أقدم الأنماط المعمارية لإنشاء تطبيقات الويب.
الاستنتاج
يُلخص هذا المقال أنماط تصميم جافا.
يمكنك التحقق من أمثلة أنماط تصميم جافا من مستودع GitHub الخاص بنا.
استمر في تعلمك مع المزيد من الدروس التعليمية في جافا، من فضلك.
Source:
https://www.digitalocean.com/community/tutorials/java-design-patterns-example-tutorial