أهلاً! نواصل الآن التعمق في موضوع مفيد واسع النطاق ومهم للغاية: أنماط التصميم. اليوم دعونا نتحدث عن نمط الجسر. مثل الأنماط الأخرى، يعمل نمط الجسر على حل المشكلات النموذجية التي يواجهها المطور عند تصميم بنية البرنامج. دعونا اليوم ندرس مميزات هذا النمط ونتعرف على كيفية استخدامه.
ما هو نمط الجسر؟
نمط الجسر هو نمط التصميم الهيكلي. بمعنى آخر، وظيفتها الرئيسية هي إنشاء بنية كاملة من الفئات والكائنات. يقوم الجسر بذلك عن طريق تقسيم فئة واحدة أو أكثر إلى تسلسلات هرمية منفصلة : التجريد والتنفيذ . إن التغيير في الوظيفة في أحد التسلسلات الهرمية لا يعني تغييرًا في التسلسل الهرمي الآخر. كل هذا جيد وجيد، لكن هذا التعريف واسع جدًا ولا يجيب على السؤال الأكثر أهمية: "ما هو نمط الجسر؟" أعتقد أنه سيكون من الأسهل عليك فهم تطبيقه العملي. لذا، دعونا ننشئ سيناريو كلاسيكيًا لنمط الجسر. لدينا فئة مجردة تمثل شكلًا هندسيًا عامًا:Shape
-
java
public abstract class Shape { public abstract void draw(); }
عندما نقرر إضافة أشكال مثل المثلثات والمستطيلات، سنجعلها ترث الفئة
Shape
: -
مستطيل.جافا:
public class Rectangle extends Shape { @Override public void draw() { System.out.println("Drawing rectangle"); } }
-
مثلث.جافا:
public class Triangle extends Shape { @Override public void draw() { System.out.println("Drawing triangle"); } }
draw()
أي أن كل شكل سيكون له لونه الخاص، وستعتمد وظيفة الطريقة على هذا اللون. للحصول على تطبيقات مختلفة لهذه draw()
الطريقة، نحتاج إلى إنشاء فئة لكل مجموعة من الألوان والشكل. إذا كان لدينا ثلاثة ألوان، فإننا بحاجة إلى ستة فئات: TriangleBlack
و TriangleGreen
، TriangleRed
و RectangleBlack
، RectangleGreen
و RectangleRed
. ستة فصول ليست مشكلة كبيرة. لكن! إذا كنا بحاجة إلى إضافة شكل أو لون جديد، فإن عدد الفئات ينمو بشكل كبير. كيفية الخروج من هذا الوضع؟ إن تخزين اللون في الحقل وتعداد كافة الخيارات باستخدام العبارات الشرطية ليس هو الحل الأفضل. الحل الجيد هو نقل اللون إلى واجهة منفصلة . لم يمض وقت طويل قبل أن يتم تنفيذه: فلنقم بإنشاء Color
واجهة بثلاثة تطبيقات: BlackColor
و GreenColor
و RedColor
:
-
اللون.جافا:
public interface Color { void fillColor(); }
-
اللون الأسود.جافا:
public class BlackColor implements Color { @Override public void fillColor() { System.out.println("Filling in black color"); } }
-
GreenColor.java
public class GreenColor implements Color { @Override public void fillColor() { System.out.println("Filling in green color"); } }
-
RedColor.java
public class RedColor implements Color { @Override public void fillColor() { System.out.println("Filling in red color"); } }
الآن نضيف
Color
حقلاً إلىShape
الفصل. سوف نحصل على قيمته في المنشئ. -
شكل جافا:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
سوف نستخدم
color
المتغير فيShape
التطبيقات. وهذا يعني أن الأشكال يمكنها الآن استخدام وظيفة الواجهةColor
. -
مستطيل.java
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color color
عبارة عن جسر يربط بين تسلسلين هرميين منفصلين.
كيفية بناء الجسر: التجريد والتنفيذ
دعونا نلقي نظرة على مخطط الفصل الذي يصور نمط الجسر: هنا يمكنك رؤية بنيتين مستقلتين يمكن تعديلهما دون التأثير على وظائف بعضهما البعض. في حالتنا هذه:- التجريد هو
Shape
الطبقة - RefinedAbstraction هو
Triangle
والفئاتRectangle
- المنفذ هو
Color
الواجهة - ConcreteImplementor هو
BlackColor
،GreenColor
والفئاتRedColor
.
Shape
عبارة عن تجريد - آلية لإدارة ملء الأشكال بألوان مختلفة، والتي يتم تفويضها إلى الواجهة Color
(المنفذ). والفئات Triangle
هي Rectangle
فئات محددة تستخدم الآلية التي يوفرها الفصل Shape
. BlackColor
، GreenColor
وهي RedColor
تطبيقات ملموسة في التسلسل الهرمي للتنفيذ.
مكان استخدام نمط الجسر
من المزايا الكبيرة لاستخدام هذا النمط أنه يمكنك إجراء تغييرات على الفئات الوظيفية في تسلسل هرمي واحد دون كسر منطق الآخر. كما يساعد هذا الأسلوب على تقليل الاقتران بين الفئات. الشرط الرئيسي عند استخدام هذا النمط هو "اتباع التعليمات" — لا تتجاهل أيًا منها! ولتحقيق هذه الغاية، دعونا نتعرف على المواقف التي يجب عليك فيها بالتأكيد استخدام نمط الجسر:-
إذا كنت بحاجة إلى توسيع عدد الكيانات بناءً على مجموعات من مفهومين (مثل الأشكال والألوان).
-
إذا كنت ترغب في تقسيم فئة كبيرة لا تستوفي مبدأ المسؤولية الفردية إلى فئات أصغر ذات وظائف ضيقة.
-
إذا كان من الضروري إجراء تغييرات على منطق كيانات معينة أثناء تشغيل البرنامج.
-
إذا كان من الضروري إخفاء التنفيذ عن عملاء الفصل أو المكتبة.
إيجابيات وسلبيات النمط
مثل الأنماط الأخرى، للجسر مزايا وعيوب. مزايا نمط الجسر:- فهو يعمل على تحسين قابلية تطوير التعليمات البرمجية — حيث يمكنك إضافة وظائف دون الخوف من كسر شيء ما في جزء آخر من البرنامج.
- فهو يقلل من عدد الفئات الفرعية عندما يعتمد عدد الكيانات على مجموعات من مفهومين (على سبيل المثال، الأشكال والألوان).
- إنه يجعل من الممكن العمل بشكل منفصل على تسلسلين هرميين منفصلين – التجريد والتنفيذ. يمكن لمطورين مختلفين إجراء تغييرات دون الخوض في تفاصيل التعليمات البرمجية الخاصة بكل منهما.
- فهو يقلل من الاقتران بين الفئات - المكان الوحيد الذي تقترن فيه الفئتان هو الجسر (أي الحقل
Color color
).
- اعتمادًا على الموقف المحدد والبنية العامة للمشروع، قد يؤثر ذلك سلبًا على أداء البرنامج (على سبيل المثال، إذا كنت بحاجة إلى تهيئة المزيد من الكائنات).
- فهو يجعل التعليمات البرمجية أقل قابلية للقراءة بسبب الحاجة إلى التبديل بين الفئتين.
GO TO FULL VERSION