שלום! אנו ממשיכים להבין נושא רחב ומאוד שימושי - תבניות עיצוב. היום נדבר על ברידג'. כמו דפוסים אחרים, Bridge משמשת לפתרון בעיות נפוצות שעמן מתמודד מפתח בעת תכנון ארכיטקטורת תוכנה. בואו ללמוד את התכונות שלו היום ולגלות איך להשתמש בו.
מהי תבנית הגשר?
תבנית הגשר היא תבנית עיצוב מבנית. כלומר, המשימה העיקרית שלו היא ליצור מבנה שלם של מחלקות ואובייקטים. Bridge פותר בעיה זו על ידי הפרדת מחלקה אחת או יותר להיררכיות נפרדות - הפשטה ויישום . שינוי בפונקציונליות בהיררכיה אחת אינו גורר שינויים בהיררכיה אחרת. הכל נראה ברור, אבל למעשה הגדרה זו נשמעת רחבה מאוד ואינה עונה על השאלה העיקרית: "מהו דפוס הגשר?" אני חושב שזה יהיה לך קל יותר להבין בפועל. בואו מיד דגמן דוגמה קלאסית לתבנית הגשר. יש לנו מחלקה מופשטת שמתארת בדרך כלל דמות גיאומטרית:Shape
-
Shape.java
public abstract class Shape { public abstract void draw(); }
כשנחליט להוסיף צורות משולש ומלבן, נקבל בירושה מהמחלקה
Shape
: -
Rectangle.java:
public class Rectangle extends Shape { @Override public void draw() { System.out.println("Drawing rectangle"); } }
-
Triangle.java:
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
:
-
Color.java:
public interface Color { void fillColor(); }
-
BlackColor.java:
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"); } }
כעת נוסיף שדה type
Color
למחלקהShape
- נקבל את הערך שלו בבנאי. -
Shape.java:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
color
נשתמש במשתנה ביישוםShape
. המשמעות היא שצורות יכולות כעת להשתמש בפונקציונליות של הממשקColor
. -
Rectangle.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
- יישומים ספציפיים בענף היישום. לעתים קרובות הם נקראים פלטפורמה.
היכן משתמשים בתבנית הגשר?
יתרון עצום בשימוש בדפוס זה הוא שאתה יכול לבצע שינויים בפונקציונליות של מחלקות בענף אחד מבלי לשבור את ההיגיון של אחר. גישה זו מסייעת גם להפחית את הצימוד בין שיעורי התוכנית. התנאי העיקרי לשימוש בדפוסים הוא "לעקוב אחר ההוראות": אל תדביק אותם בשום מקום! למעשה, בואו להבין באילו מקרים אתה בהחלט צריך להשתמש ב-Bridge:-
אם יש צורך להרחיב את מספר הישויות לשני כיוונים (צורות גיאומטריות, צבעים).
-
אם אתה רוצה לחלק מחלקה גדולה שאינה עומדת בעקרון אחריות יחידה למחלקות קטנות יותר עם פונקציונליות של פרופיל צר.
-
אם יש צורך אפשרי לבצע שינויים בלוגיקת הפעולה של ישויות מסוימות בזמן שהתוכנית פועלת.
-
במידת הצורך, הסתר את היישום מלקוחות הכיתה (ספרייה).
יתרונות וחסרונות של הדפוס
כמו דפוסים אחרים, לגשר יש גם יתרונות וגם חסרונות. היתרונות של ברידג':- משפר את מדרגיות הקוד - ניתן להוסיף פונקציונליות ללא חשש לשבור משהו בחלק אחר של התוכנית.
- מפחית את מספר תת המחלקות - פועל כאשר יש צורך להרחיב את מספר הישויות לשני כיוונים (לדוגמה, מספר הצורות ומספר הצבעים).
- מאפשר לעבוד בנפרד על שני ענפים עצמאיים של אבסטרקציה והטמעה - זה יכול להיעשות על ידי שני מפתחים שונים מבלי להתעמק בפרטי הקוד של זה.
- צמצום הצימוד של מחלקות - המקום היחיד שבו שתי מחלקות מחוברות הוא הגשר (שדה
Color color
).
- בהתאם למצב הספציפי ולמבנה הפרויקט בכללותו, עלולה להיות השפעה שלילית על פרודוקטיביות התוכנית (לדוגמה, אם יש צורך לאתחל אובייקטים נוספים).
- מסבך את קריאת הקוד בשל הצורך לנווט בין מחלקות.
GO TO FULL VERSION