תבנית עיצוב
תבניות עיצוב נפוצות > תבניות התנהגות

כאשר מפתחים מערכת גדולה ישנו קושי בניתוח אינטראקציה בין אובייקטים, לכן עולה הצורך להגדיר סמכויות ולאפיין את אופי התקשורת בין הישויות שבה. תבניות התנהגות, עוסקות בבעיות אלו, בדומה לארגון, על ידי הגדרת הסמכויות הנדרשת והתקשורת בין הישויות. ירושה והרכבה עוזרים לתבניות התנהגותיות בהגדרת היחסים בין המחלקות.
| שם התבנית | תיאור | UML |
| --- | --- | --- |
| Chain of responsibility | מניעת קשר בין השולח של בקשה למקבל שלה על ידי כך שיותר מאובייקט אחד יוכל לטפל בבקשה. שרשור האובייקטים המקבלים והעברת הבקשה לאורך השרשרת עד שאובייקט מטפל בה. נשתמש כאשר: יותר מאובייקט אחד צריך לטפל בדרישה, והוא איננו ידוע מראש.  יש צורך להעביר דרישה לאובייקט, מבלי לציין את שמו במפורש.  קבוצת האובייקטים המטפלים בדרישה ניתנת להגדרה באופן דינמי. |   |
| Command | כימוס של בקשה כאובייקט, ובצורה זו מאפשרת להעביר למקבלים בקשות שונות, להכניס בקשות לתור או לרשום אותן ללוג, ולתמוך בביטול פעולות. נשתמש כאשר: Command הוא תחליף מונחה עצמים לפונקציות callback.  מציין, מכניס לתור ומבצע דרישות בזמנים שונים. ל-Command יכולת לחיות באופן בלתי תלוי בדרישה המקורית. אם ניתן לייצג את מקבל הדרישה באופן בלתי תלוי במרחב הכתובות, אזי ניתן להעביר את ה-Command לתהליך אחר. |  |
| Interpreter | בהינתן שפה, מגדיר ייצוג של הדקדוק שלה יחד עם מפרש שמשתמש בייצוג כדי לפרש את המשפטים של השפה. כאשר יש שפה לפענח, וניתן לייצג את השפה כעצי תחביר מופשטים (לדוגמה ביטוי רגולרי). התבנית תעבוד כאשר: התחביר פשוט. עבור תחביר מורכב נקבל היררכיה גדולה וקשה לניהול.  יעילות איננה גורם קריטי. |   |
| Iterator | דרך לגשת ברצף לאלמנטים באובייקט המורכב מאוסף של אלמנטים בלי לחשוף את המבנה הפנימי שלו. נשתמש כאשר: נדרשת גישה לרכיבים הבונים אובייקט, בלא לחשוף את מבנהו הפנימי.  נדרשת תמיכה במספר מעברים על צירוף של אובייקטים.  רוצים ממשק אחיד לעבודה עם מבנים המכילים צירוף של אובייקטים. |   |
| Mediator | מגדיר אובייקט שמכמס את האופן שבו אוסף של אובייקטים מתקשרים. התבנית תומכת בצימוד רפוי, בכך שאובייקטים לא מצביעים אחד לשני באופן ישיר, אלא למתווך (Mediator), ובכך ניתן לשנות את האינטראקציה שלהם באופן עצמאי. נשתמש כאשר: קבוצה של אובייקטים מתקשרים באופן מוגדר היטב אבל מורכב. התלות הנוצרת איננה מבנית וקשה להבנה.  קשה לבצע שימוש חוזר באובייקט עקב תקשורת עם מספר רב של אובייקטים.  צריך לאפשר להתנהגות המבוזרת בין כמה מחלקות התאמה אישית, בלא לבצע ירושה רבה. |  |
| Memento | ללא פגיעה בכימוס, תפיסה וייחצון של המצב הפנימי של אובייקט, כך שהאובייקט יוכל להיות משוחזר למצב זה מאוחר יותר. נשתמש כאשר חלק מה-state של האובייקט חייב להישמר, כדי לשחזר אותו בעבר וגם כאשר ממשק ישיר לקבלת ה-state הפנימי עלול לחשוף את המימוש ולפגוע בהכמסה. |  |
| Null Object | משמש כברירת מחדל לאובייקט, ובכך מונע את הצורך לוודא שהאובייקט אינו null לפני שימוש בו. |   |
| Observer | מגדיר תלות של אחד לרבים בין אובייקטים, כך שכאשר אובייקט אחד משנה את מצבו, כל התלויים בו מיודעים על השינוי ומתעדכנים אוטומטית. נשתמש כאשר: כאשר להפשטה יש שני היבטים, האחד תלוי בשני. שמירת ההיבטים באובייקטים שונים מסייעת בשינוי ושימוש חוזר.  שינוי של אובייקט אחד גורר שינוי באובייקט אחר, ולא ידוע מראש כמה אובייקטים יש לשנות.  אובייקט צריך להודיע לאובייקטים אחרים מבלי להניח הנחות לגבי מה הם אותם אובייקטים, כלומר רוצים למנוע צימוד חזק. |  |
| Blackboard | Observer כללי המאפשר מספר קוראים וכותבים. המידע משותף לרוחב המערכת. |  |
| State | מאפשר לאובייקט לשנות את התנהגות כאשר מצבו הפנימי משתנה. האובייקט ישנה את המחלקה שבה הוא משתמש. נשתמש כאשר:  התנהגות האובייקט תלויה במצבו, והוא חייב לשנותה בזמן ריצה (בתלות במצבו הפנימי).  לפעולות יש תנאים גדולים, התלויים במצבו הפנימי של האובייקט. המצב מיוצג, לרוב, על ידי מונים קבועים. |  |
| Strategy | מגדיר משפחה של אלגוריתמים, מכמס כל אחד מהם, ומאפשר להחליף את השימוש בהם. ניתן לשנות את האלגוריתם באופן עצמאי בלי תלות במשתמשים במחלקה. נשתמש כאשר: הרבה מחלקות קשורות שונות רק בהתנהגותן. strategy מאפשר לקנפג מחלקה לעבודה עם מספר רב של התנהגויות.  יש צורך בווריאציה של האלגוריתם.  האלגוריתם משתמש במידע שלא צריך להיות חשוף ללקוח.  המחלקה מגדירה הרבה התנהגויות המופיעות כסדרה של תנאים בפעולות. במקום הרבה תנאים, פשוט ניתן להעביר כל קטע קוד ל-Strategy המתאים. |   |
| Specification | צירוף לוגיקה עסקית בצורה בוליאנית (לא, או, וגם). |   |
| Template method | מגדיר שלד של אלגוריתם בפעולה, ומפנה חלק מן הצעדים לתת מחלקות. כך תת-מחלקות יכולות להגדיר מחדש צעדים מסוימים של האלגוריתם, ללא שינוי של המבנה שלו. נשתמש כאשר: נרצה לממש את החלקים הקבועים של האלגוריתם, ולאפשר למחלקות היורשות לקבוע את השאר.  נרצה לרכז את ההתנהגות המשותפת של תתי המחלקות במקום אחד, כדי למנוע שכפול קוד.  כשרוצים לשלוט בהרחבות המבוצעות על ידי המחלקות היורשות. ניתן להגדיר Template method הקורא לפעולות "עוגן" בנקודות מסוימות. |   |
| Visitor | מייצג פעולה לביצוע על האלמנטים של מבנה האובייקט. בכך מאפשרת התבנית להגדיר פעולה חדשה ללא צורך לשנות את המחלקות של האלמנטים שעליהם היא מבוצעת. נשתמש כאשר: האובייקט מכיל מחלקות רבות עם ממשקים שונים, ורוצים לבצע פעולות התלויות במחלקות המממשות.  כאשר יש צורך להפעיל פעולות שונות ובלתי תלויות על האלמנטים המרכיבים את האובייקט, ורוצים להימנע מ"זיהום" המחלקות עם פעולות אלו. ה-Visitor מאפשר לשמור על פעולות דומות יחדיו, על ידי הגדרתם במחלקה אחת. כאשר מבנה האובייקט משותף למספר אפליקציות, ניתן להשתמש ב-Visitor כדי להכניס את הפעולות רק במקום בו הן נדרשות. |    |
התבנית Inversion of control אשר מאפשרת הזרקה של אובייקטים מתאימים בשלב ההרצה משמשת כתבנית הבסיסית למערכת התשתית הנפוצה Spring.