היי! כעת אנו ממשיכים להתעמק בנושא שימושי נרחב וסופר חשוב: דפוסי עיצוב. היום בואו נדבר על תבנית הגשר. כמו דפוסים אחרים, דפוס הגשר משמש לפתרון בעיות טיפוסיות בהן נתקל מפתח בעת תכנון ארכיטקטורת תוכנה. היום בואו נלמד את התכונות של דפוס זה ונגלה כיצד להשתמש בו.
כאן ניתן לראות שני מבנים עצמאיים שניתן לשנות מבלי להשפיע זה על הפונקציונליות של זה. במקרה שלנו:
מהי תבנית הגשר?
תבנית הגשר היא תבנית עיצובית מבנית. במילים אחרות, תפקידו העיקרי הוא ליצור מבנה מלא מתוך מחלקות ואובייקטים. גשר עושה זאת על ידי חלוקת מחלקה אחת או יותר להיררכיות נפרדות : הפשטה ויישום . שינוי בפונקציונליות בהיררכיה אחת אינו גורר שינוי בהיררכיה השנייה. זה הכל טוב ויפה, אבל ההגדרה הזו רחבה מאוד ואינה עונה על השאלה החשובה ביותר: "מהו תבנית הגשר?" אני חושב שיהיה לך קל יותר להבין את היישום המעשי שלה. אז מיד, בואו ניצור תרחיש קלאסי עבור תבנית הגשר. יש לנו מחלקה מופשטת, המייצגת דמות גיאומטרית גנרית: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"); } }
כעת נוסיף
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
andRectangle
classes - מיישם הוא
Color
הממשק - ConcreteImplementor הוא ה-
BlackColor
,GreenColor
ו-RedColor
classes.
Shape
היא הפשטה - מנגנון לניהול מילוי של צורות בצבעים שונים, אשר מעביר לממשק Color
(Implementor). המחלקות Triangle
והן Rectangle
הן כיתות קונקרטיות המשתמשות במנגנון שהמעמד זמין Shape
. BlackColor
, GreenColor
והם RedColor
יישומים קונקרטיים בהיררכיית היישום.
היכן להשתמש בתבנית הגשר
יתרון עצום בשימוש בדפוס זה הוא שאתה יכול לבצע שינויים במחלקות הפונקציונליות בהיררכיה אחת מבלי לשבור את ההיגיון של האחרת. כמו כן, גישה זו עוזרת להפחית צימוד בין מחלקות. הדרישה העיקרית בעת שימוש בדפוס זה היא "עקוב אחר ההוראות" - אל תתעלם מאף אחת מהן! לשם כך, בואו נבין את המצבים שבהם אתה בהחלט צריך להשתמש בתבנית הגשר:-
אם אתה צריך להרחיב את מספר הישויות על סמך שילובים של שני מושגים (למשל צורות וצבעים).
-
אם אתה רוצה לחלק מחלקה גדולה שאינה עומדת בעקרון האחריות היחידה למחלקות קטנות יותר בעלות פונקציונליות צרה.
-
אם יש צורך לבצע שינויים בלוגיקה של ישויות מסוימות בזמן שהתוכנית פועלת.
-
אם יש צורך להסתיר יישום מלקוחות הכיתה או הספרייה.
יתרונות וחסרונות של הדפוס
כמו דפוסים אחרים, לגשר יש גם יתרונות וגם חסרונות. יתרונות דפוס הגשר:- זה משפר את מדרגיות הקוד - אתה יכול להוסיף פונקציונליות מבלי לחשוש לשבור משהו בחלק אחר של התוכנית.
- זה מפחית את מספר תת המחלקות כאשר מספר הישויות יתבסס אחרת על שילובים של שני מושגים (לדוגמה, צורות וצבעים).
- זה מאפשר לעבוד בנפרד על שתי היררכיות נפרדות - הפשטה ויישום. שני מפתחים שונים יכולים לבצע שינויים מבלי להתעמק בפרטי הקוד של זה.
- זה מפחית את הצימוד בין מחלקות - המקום היחיד שבו שתי המחלקות מחוברות הוא הגשר (כלומר השדה
Color color
).
- בהתאם למצב הספציפי ולמבנה הכללי של פרויקט, זה עלול להשפיע לרעה על ביצועי התוכנית (לדוגמה, אם אתה צריך לאתחל אובייקטים נוספים).
- זה הופך את הקוד לפחות קריא בגלל הצורך לעבור בין שתי המחלקות.
GO TO FULL VERSION