תבנית עיצוב

יש לערוך ערך זה. ייתכן שהערך סובל מבעיות ניסוח, סגנון טעון שיפור או צורך בהגהה, או שיש לעצב אותו, או מפגמים טכניים כגון מיעוט קישורים פנימיים.
אתם מוזמנים לסייע ולערוך את הערך. אם לדעתכם אין צורך בעריכת הערך, ניתן להסיר את התבנית. ייתכן שתמצאו פירוט בדף השיחה.
יש לערוך ערך זה. ייתכן שהערך סובל מבעיות ניסוח, סגנון טעון שיפור או צורך בהגהה, או שיש לעצב אותו, או מפגמים טכניים כגון מיעוט קישורים פנימיים.
אתם מוזמנים לסייע ולערוך את הערך. אם לדעתכם אין צורך בעריכת הערך, ניתן להסיר את התבנית. ייתכן שתמצאו פירוט בדף השיחה.

בהנדסת תוכנה, תבנית עיצובאנגלית: Design pattern) הוא תיאור של פתרון כללי לבעיה שכיחה בעיצוב תוכנה. תבניות עיצוב איננה פתרון מדויק שניתן להעבירו הישר לקוד, אלא היא תיאור דרך לפתרון בעיה, שעשויה להיות שימושית במצבים רבים.

תבניות עיצוב מונחות עצמים מציגות לרוב יחסים וקשרי גומלין בין מחלקות או אובייקטים, בלי לפרט את המחלקות או אובייקטי היישום הסופיים המעורבים. אלגוריתמים אינם נחשבים כתבנית עיצוב, כיוון שהם פותרים בעיות חישוביות ולא בעיות עיצוב.[1]

עקרונות מאחורי תבניות עיצוב

ברוב תבניות העיצוב נעשה שימוש נרחב בעקרונות תכנות מונחה עצמים ו- SOLID כמו פולימורפיזם ועקרון פתיחות/סגירות.

תבניות עיצוב עשויות להתפתח באופן נקודתי עבור תחום עסקי מסוים שתוכנה נכתבת עבורו. לדוגמה, מערכות מידע, מערכות טלפוניה, יישומים רפואיים וכיוצא בזה יכילו בדרך כלל פתרונות לבעיות חוזרות ונשנות האופייניות לתחום המסוים. היכולת להכליל תבנית עיצוב מתוך פתרון שיושם במערכת מסוימת עוזרת לפתח מערכות דומות בעתיד באיכות גבוהה יותר.

בהיבט רחב יותר ניתן למצוא שילובים של תבניות עיצוב היכולים להיחשב כתבניות ארכיטקטורה משום שהם משפיעים על ההיבט העיצובי הרחב של התוכנה הנכתבת מעבר לסוגיות מקומיות.[2] דוגמה לתבנית ארכיטקטורה נודעת מסוג זה היא תבנית Model View Controller.

היסטוריה

מקורן של תבניות העיצוב הוא מתחום הארכיטקטורה. כריסטופר אלכסנדר, ארכיטקט במקצועו, הוציא בשנת 1977 ספר[3] ובו הגדיר באופן פורמלי 253 בעיות מוכרות מעולם הארכיטקטורה ולהן פתרונות מופשטים. עשר שנים מאוחר יותר ב-1987 השתעשעו קנט בק ווורד קנינגהם ברעיון של השמה של תבניות עיצוב לעולם התכנות, הם הציגו את תוצאותיהם בוועידת OOPSLA.[4] בנוסף הם פיתחו יחד תבנית עיצוב לעיבוד קרניים גרפיות בשפת Smalltalk.

  • בשנת 1988 אריך גמא התחיל לכתוב עבודת מחקר לדוקטורט באוניברסיטת ציריך בנושא "קווים כלליים לעיבוד תוכנה".
  • בשנת 1991 לאחר עבודת מחקר שארכה כשנתיים הוציא ג'יימס קופלין ספר בשם "Advanced C++ Idioms" - המכיל מגוון דוגמאות לפתרון בעיות שונות בתכנות ב-C++‎.
כנופיית הארבעה או Gang of Four

כינוי שניתן לאריך גמא, ריצ'רד הלם, רלף ג'ונסון וג'ון ויליסידס, מחברי הספר: Design Patterns - Elements of Reusable Object-Oriented Software. (שמם שאול מכנופיית הארבעה הסינית). ספרם שיצא ב-1994 היה הראשון שאסף ותיעד באופן מעמיק תבניות עיצוב. עשרים ושתיים תבניות העיצוב שהופיעו בספר הפכו עם השנים לתבניות העיצוב המוכרות ביותר והיוו בסיס לכל ידע נוסף שנצבר בתחום תבניות העיצוב.

בין התבניות העיקריות שתועדו בספר:

תיעוד

דוגמה של תרשים UML של מחלקה המממשת את תבנית Singleton

הגדרת תבנית עיצוב תכיל את הפרמטרים הבאים:

  • שם תבנית העיצוב וסיווגה
  • תיאור מופשט של הבעיה אותה תבנית העיצוב נועדה לפתור
  • הצגת הפתרון בצורה מורחבת הכוללת תרשים OMT‏ (Object Modeling Technique) או UML‏ (Unified Modeling Language).
  • תוצאות והשלכות של יישום הפתרון המוצע

דוגמה

  • שם - תבנית Singleton, תבנית יצירה
  • בעיה - יש צורך במופע יחיד של מחלקה.
  • פתרון - הגדרת בנית המחלקה רק בתוכה והחצנת פונקציה שרק בקריאה הראשונה אליה תיצור מופע של המחלקה (ראו פרוט בערך עצמו).
  • השלכות - שימוש לא נכון בתבנית העיצוב עלול להוביל לקוד בו המחלקות בצמידות או תלות (Coupling) גבוהה.

יתרונות

הגדרת התבניות תחת רעיון אחד, ובעיקר הגדרת שם התבנית, יוצרות שפה משותפת, ובכך מקלות על ההבנה בין מפתחים ממקומות שונים בהתייחסות לבעיה ולדרך פתרונה.
בנוסף כיוון שהתבניות עצמן מוגדרות באופן מופשט אך בצורה פורמלית, הן אינן תלויות בשפה או בסביבת פיתוח יחידה, דבר המאפשר צבירה והמשכיות של הידע הנלמד.
כמו כן, יצירה של תבניות עיצוב לא מתמקדת בטכנולוגיה אלא בתיעוד הבעיה ופתרונה דבר שמעשיר את הספרות המקצועית בידע רב וחושף מתכנתים מתחילים לידע ברמה גבוהה.

התנגדות

לעיתים תבנית שעוצבה על ידי קבוצה מצומצמת של מפתחים אינה מקיפה את הבעיה מכל כיווניה, וכאשר מנסים להחיל את הפתרון במצבים לא מתאימים או על מערכת מסורבלת הדבר עולה בשגיאות או בסיבוך המבנה הפנימי של הקוד.

יש הטוענים [דרוש מקור] שתבניות מאטות את ההתקדמות של מתכנתים מתחילים כיוון שהם אינם צריכים להשקיע מאמץ בפתרון בעיות סבוכות. הבעיה נוצרת במיוחד במקרים בהם מעתיקים יישום של תבנית ללא לימוד והבנה מעמיקה של הבעיה והפתרון המוצע. מתכנת מקצועי ילמד קודם את התאוריה שמאחורי התבניות ורק לאחר מכן יחליט באופן מושכל באיזו תבנית להשתמש לפתרון הבעיה. זה עשוי למנוע פיתוח של תוכניות גרועות הכתובות ב"עיוורון" מוחלט.

במהלך ההתפתחות של תבניות העיצוב הוגדרו גם תבניות אשר מציעות כביכול פתרון לבעיה מסוימת, אך הפתרון שהן מציעות אינו נכון, או שאינו מציג דרך נכונה להתמודדות עם הבעיה. תבניות אלו נקראות Anti Pattern. יש הטוענים שגם בין תבניות העיצוב המקובלות כמומלצות קיימות תבניות שאינן מספקות פתרון טוב לבעיה ומהוות Anti Pattern. דוגמה לתבנית כזאת היא התבנית Singleton אשר מצד אחד מקובלת על מתכנתים רבים כאחת התבניות הטובות ביותר ולדעת אחרים היא Anti Pattern. דעות סותרות אלו מראות שהסתמכות בעיניים עצומות על תבניות מוגדרות מוטעית מיסודה ויכולה לגרום לטעויות שתעלנה ביוקר הן מבחינת זמן והן מבחינת משאבים ותקציב.[5]

תבניות עיצוב נפוצות

באופן כללי, ניתן לחלק את התבניות לשלושה סוגים:[6]

תבניות יצירה

מטרת תבניות אילו היא ליצור הפשטה (Abstraction) לתהליך היצירה של אובייקטים, על ידי ביצוע הפרדה בין המערכת לבין יצירה או תצוגה של האובייקטים הנוצרים. כלומר, הידע הקונקרטי על סוג המחלקה ממנה ניצור אובייקט ותהליך היצירה עצמו יוכמסו ובנוסף, לאחר היצירה הגישה לאובייקט הנוצר תעשה באמצעות ממשק.

שם התבנית תיאור UML
Abstract Factory "בית חרושת ליצירת אובייקטים" - ממשק המשמש ליצירת אובייקטים תלויים, ללא ציון המחלקות הנוצרות.[7]

נשתמש כאשר:

  • המערכת צריכה להיות בלתי תלויה באופן בו ממומשים, נוצרים או מיוצגים התוצרים שלה.
  • כאשר רוצים לתת ספריה של נותני שירות, ורוצים לחשוף רק את הממשק שלהם ולא את המימוש.
  • קבוצה של אובייקטים מתוכננים לעבודה יחדיו, ויש לכפות אילוץ זה.
Abstract Factory
Factory Method יצירת עצמים ללא הכרה של המחלקות שלהם, ניתן יכולות למחלקות יורשות לדרוס את השיטה שהממשק חושף עם שיטה משלהם, וכך ליצור את הטיפוס שנדרש.

נשתמש כאשר:

  • המחלקה לא יכולה לצפות אילו אובייקטים של איזו מחלקה עליה ליצור.
  • המחלקה מעוניינת לתת למחלקות היורשות לקבוע את האובייקטים הנוצרים.
  • מחלקות מאצילות אחריות לאחת מתוך מספר מחלקות יורשות, ויש לרכז את הידע איזו מחלקה יורשת היא האחת עליה הואצלה האחריות.
Factory Method
Builder הפרדת יצירת האובייקט מייצוגו, באובייקטים מורכבים. כך ניתן להשתמש באותו תהליך יצירה ליצירת אובייקטים שונים.

נשתמש כאשר:

  • האלגוריתם ליצירת אובייקטים מורכבים צריך להיות בלתי תלוי בחלקים היוצרים את האובייקט ובהרכבתם.
  • תהליך הבנייה חייב לאפשר ייצוגים שונים עבור האובייקטים הנבנים.
Builder
Lazy initialization "אתחול עצל" - טקטיקה המאפשרת שליטה על בזבוז משאבים, חישוב הזמן המתאים ליצירת האובייקט בפועל רק לזמן שחייבים אותו, תוך התחשבות בתהליכים השונים והכרעה איזה תהליך "יקר" יותר.
Object pool שחרור משאבים על ידי מחזור אובייקטים שאינם בשימוש.
Prototype הגדרת אבטיפוס של אובייקטים ויצירת אובייקטים חדשים כהעתק שלו.

נשתמש כאשר:

המערכת צריכה להיות בלתי תלויה באופן בו פריטים נוצרים, מורכבים ומייצוגים, וגם מתקיים לפחות אחד מהתנאים מהבאים:

  • כאשר המחלקות עבורן צריך ליצור מופע מצוינות בזמן ריצה, לדוגמה על ידי טעינה דינמית.
  • יש למנוע בניית היררכיה של מחלקות Factory המקבילות להיררכיית מחלקות Product.
  • כאשר למופע של מחלקה יש מספר מצומצם מאוד של מצבים. במקרה זה יהיה נוח יותר לשמור מספר אבות טיפוס ולשכפל אותם, במקום ליצור מופע של המחלקה בכל פעם עבור המצב הנדרש.
Prototype
Singleton הגדרת נקודת כניסה יחידה לאובייקט לשם הקצאת מופע יחיד של האובייקט בזיכרון.

נשתמש כאשר:

  • חייב להיות מופע אחד בדיוק של מחלקה, וחייבת להיות נקודת ממשק ידועה למחלקה זו.
  • המופע היחיד יורחב על ידי ירושה, והלקוחות יוכלו להשתמש במופע המורחב מבלי לשנות את הקוד.
Singleton
Multiton יצירת מצב בו במחלקה יש רק מופעים בעלי שם (לא מצביעים), וסיפוק נקודת גישה גלובלית אליהם. Multiton
Resource acquisition is initialization הבטחת תוחלת חיים נכונה של אובייקטים, לשם ניהול מושכל של המשאבים.

תבניות מבנה

מטרתן של תבניות אילו היא להקל על עיצוב המערכת על ידי זיהוי דרך פשוטה לממש קשרים בין ישויות.

שם התבנית תיאור UML
Adapter יצירת התאמה בין מחלקה נתונה (או חיצונית) לבין ממשק מצופה על ידי הגדרת מחלקה המשמשת כ"מַתְאֵם".

נשתמש כאשר:

  • נרצה להשתמש במחלקה שהממשק שלה לא מתאים לזה הנדרש.
  • נרצה ליצור מחלקות לשימוש חוזר אשר משתפות פעולה עם מחלקות לא שייכות או לא ידועות, אשר לא בהכרח בעלות ממשק מתאים.
Adapter
Bridge "גשר" - יצירת חוסר תלות בין ממשק למימוש, על ידי הפרדה מוחלטת ביניהם.

נשתמש כאשר:

  • נרצה למנוע קישור קבוע בין ההפשטה למימוש, לדוגמה כאשר רוצים שהמימוש ייקבע בזמן דינמי.
  • ההפשטה וגם המימוש מורחבים על ידי ירושה.
  • נרצה למנוע הידור מחדש של כל המערכת לאחר שינוי במימוש ההפשטה.
  • יש צורך לשתף מימוש בין מספר אובייקטים, ויש להסתיר עובדה זו מהלקוח.
Bridge
Composite גיבוש אובייקטים למבנה היררכי של עץ, אפשור התייחסות לאובייקטים כאובייקטים עצמאיים או באופן אחיד לצירוף של אובייקטים.

נשתמש כאשר נרצה שהלקוחות יוכלו להתעלם מההבדלים בין הרכבה של אובייקטים לאובייקטים בודדים, ויתייחסו לשניהם באופן אחיד.

Composite
Decorator הוספת אחריויות נוספות לאובייקט באופן דינמי תוך שמירה על אותו הממשק. Decorator משמש כחלופה גמישה לתת מחלקה כדי להרחיב פונקציונליות.

נשתמש כאשר:

  • נרצה להוסיף אחריות באופן דינמי ושקוף לאובייקטים מסוימים (בלא להשפיע על אובייקטים אחרים).
  • הרחבה על ידי ירושה היא לא מעשית. לעיתים נדרש מספר רב של הרחבות בלתי תלויות, דבר העלול ליצור "אינפלציה" של ירושות. או לעיתים הגדרות המחלקה חבויות או שאין אפשרות לרשת ממנה.
Decorator
Facade מאפשר ממשק אחיד לאוסף של ממשקים בתת-מערכת. Facade מגדיר ממשק ברמה גבוהה יותר המאפשר שימוש קל בתת-מערכת.

נשתמש כאשר:

  • נרצה לתת ממשק פשוט לתת מערכת מורכבת.
  • קיימים יחסי תלות רבים בין הלקוחות והמחלקות המממשות. Facade מסייע בהחלשת הצימוד בין הלקוחות ותתי המערכות.
  • כאשר רוצים לעבוד בשכבות בתתי המערכת, כאשר ה-Facade הוא נקודת הכניסה לרמת התת-מערכת. אם תתי המערכות הן בלתי תלויות, ניתן לפשט את התלות בינן על ידי הקפדה על כך שכל התקשורת בינן תעשה דרך ה-Facade בלבד.
Facade
Flyweight שימוש בשיתוף כדי לתמוך במספר אובייקטים כדי לחסוך בזיכרון.

יעילותו של Flyweight תלויה באיך ומתי משתמשים בה. נכון להשתמש בתבנית כאשר כל התנאים הבאים מתקיימים:

  • האפליקציה משתמשת בכמות גדולה של אובייקטים.
  • עלות האחסון גבוהה עקב עלייה בכמות האובייקטים.
  • ניתן להוציא את ה-state של רוב האובייקטים.
  • ניתן להחליף קבוצות רבות של אובייקטים בכמות קטנה יחסית של אובייקטים משותפים, ברגע שמסירים את ה-state החיצוני.
  • האפליקציה של תלויה בזהות האובייקט. בגלל השימוש באובייקטים משותפים, בדיקת זהות תחזיר true עבור אובייקטים שונים.
Flyweight
Proxy מאפשר לשלוט בגישה לאובייקט אחר.

מתאים לשימוש כאשר במקום מצביע רגיל יש צורך במצביע רב תכליתי או מתוחכם לאובייקט. קיימות כמה Proxy סיטואציות בהן נכון להשתמש בתבנית:

  • פרוקסי מרוחק (Remote proxy): מתן ייצוג מקומי עבור אובייקט במרחב כתובות אחר.
  • פרוקסי ווירטואלי (Virtual proxy): יוצר אובייקטים "יקרים" על פי דרישה.
  • פרוקסי מגן (Protection proxy): שולט בגישה לאובייקט המקורי. נוח כאשר רוצים לשלוט בהרשאות שונות לאותו אובייקט.
Proxy

תבניות התנהגות

כאשר מפתחים מערכת גדולה ישנו קושי בניתוח אינטראקציה בין אובייקטים, לכן עולה הצורך להגדיר סמכויות ולאפיין את אופי התקשורת בין הישויות שבה. תבניות התנהגות, עוסקות בבעיות אלו, בדומה לארגון, על ידי הגדרת הסמכויות הנדרשת והתקשורת בין הישויות. ירושה והרכבה עוזרים לתבניות התנהגותיות בהגדרת היחסים בין המחלקות.

שם התבנית תיאור UML
Chain of responsibility מניעת קשר בין השולח של בקשה למקבל שלה על ידי כך שיותר מאובייקט אחד יוכל לטפל בבקשה. שרשור האובייקטים המקבלים והעברת הבקשה לאורך השרשרת עד שאובייקט מטפל בה.

נשתמש כאשר:

  • יותר מאובייקט אחד צריך לטפל בדרישה, והוא איננו ידוע מראש.
  • יש צורך להעביר דרישה לאובייקט, מבלי לציין את שמו במפורש.
  • קבוצת האובייקטים המטפלים בדרישה ניתנת להגדרה באופן דינמי.

Chain of Responsibility

Command כימוס של בקשה כאובייקט, ובצורה זו מאפשרת להעביר למקבלים בקשות שונות, להכניס בקשות לתור או לרשום אותן ללוג, ולתמוך בביטול פעולות.

נשתמש כאשר:

  • Command הוא תחליף מונחה עצמים לפונקציות callback.
  • מציין, מכניס לתור ומבצע דרישות בזמנים שונים. ל-Command יכולת לחיות באופן בלתי תלוי בדרישה המקורית. אם ניתן לייצג את מקבל הדרישה באופן בלתי תלוי במרחב הכתובות, אזי ניתן להעביר את ה-Command לתהליך אחר.
Command
Interpreter בהינתן שפה, מגדיר ייצוג של הדקדוק שלה יחד עם מפרש שמשתמש בייצוג כדי לפרש את המשפטים של השפה.

כאשר יש שפה לפענח, וניתן לייצג את השפה כעצי תחביר מופשטים (לדוגמה ביטוי רגולרי). התבנית תעבוד כאשר:

  • התחביר פשוט. עבור תחביר מורכב נקבל היררכיה גדולה וקשה לניהול.
  • יעילות איננה גורם קריטי.

Interpreter

Iterator דרך לגשת ברצף לאלמנטים באובייקט המורכב מאוסף של אלמנטים בלי לחשוף את המבנה הפנימי שלו.

נשתמש כאשר:

  • נדרשת גישה לרכיבים הבונים אובייקט, בלא לחשוף את מבנהו הפנימי.
  • נדרשת תמיכה במספר מעברים על צירוף של אובייקטים.
  • רוצים ממשק אחיד לעבודה עם מבנים המכילים צירוף של אובייקטים.

iterator

Mediator מגדיר אובייקט שמכמס את האופן שבו אוסף של אובייקטים מתקשרים. התבנית תומכת בצימוד רפוי, בכך שאובייקטים לא מצביעים אחד לשני באופן ישיר, אלא למתווך (Mediator), ובכך ניתן לשנות את האינטראקציה שלהם באופן עצמאי.

נשתמש כאשר:

  • קבוצה של אובייקטים מתקשרים באופן מוגדר היטב אבל מורכב. התלות הנוצרת איננה מבנית וקשה להבנה.
  • קשה לבצע שימוש חוזר באובייקט עקב תקשורת עם מספר רב של אובייקטים.
  • צריך לאפשר להתנהגות המבוזרת בין כמה מחלקות התאמה אישית, בלא לבצע ירושה רבה.
Mediator
Memento ללא פגיעה בכימוס, תפיסה וייחצון של המצב הפנימי של אובייקט, כך שהאובייקט יוכל להיות משוחזר למצב זה מאוחר יותר.

נשתמש כאשר חלק מה-state של האובייקט חייב להישמר, כדי לשחזר אותו בעבר וגם כאשר ממשק ישיר לקבלת ה-state הפנימי עלול לחשוף את המימוש ולפגוע בהכמסה.

Memento Pattern
Null Object משמש כברירת מחדל לאובייקט, ובכך מונע את הצורך לוודא שהאובייקט אינו null לפני שימוש בו.

Pattern: Null object

Observer מגדיר תלות של אחד לרבים בין אובייקטים, כך שכאשר אובייקט אחד משנה את מצבו, כל התלויים בו מיודעים על השינוי ומתעדכנים אוטומטית.

נשתמש כאשר:

  • כאשר להפשטה יש שני היבטים, האחד תלוי בשני. שמירת ההיבטים באובייקטים שונים מסייעת בשינוי ושימוש חוזר.
  • שינוי של אובייקט אחד גורר שינוי באובייקט אחר, ולא ידוע מראש כמה אובייקטים יש לשנות.
  • אובייקט צריך להודיע לאובייקטים אחרים מבלי להניח הנחות לגבי מה הם אותם אובייקטים, כלומר רוצים למנוע צימוד חזק.
A UML diagram of the observer pattern
Blackboard Observer כללי המאפשר מספר קוראים וכותבים. המידע משותף לרוחב המערכת.
State מאפשר לאובייקט לשנות את התנהגות כאשר מצבו הפנימי משתנה. האובייקט ישנה את המחלקה שבה הוא משתמש.

נשתמש כאשר:

  • התנהגות האובייקט תלויה במצבו, והוא חייב לשנותה בזמן ריצה (בתלות במצבו הפנימי).
  • לפעולות יש תנאים גדולים, התלויים במצבו הפנימי של האובייקט. המצב מיוצג, לרוב, על ידי מונים קבועים.
UML Class Diagram of the State Design Pattern
Strategy מגדיר משפחה של אלגוריתמים, מכמס כל אחד מהם, ומאפשר להחליף את השימוש בהם. ניתן לשנות את האלגוריתם באופן עצמאי בלי תלות במשתמשים במחלקה.

נשתמש כאשר:

  • הרבה מחלקות קשורות שונות רק בהתנהגותן. strategy מאפשר לקנפג מחלקה לעבודה עם מספר רב של התנהגויות.
  • יש צורך בווריאציה של האלגוריתם.
  • האלגוריתם משתמש במידע שלא צריך להיות חשוף ללקוח.
  • המחלקה מגדירה הרבה התנהגויות המופיעות כסדרה של תנאים בפעולות. במקום הרבה תנאים, פשוט ניתן להעביר כל קטע קוד ל-Strategy המתאים.

Strategy Pattern in UML Structure

Specification צירוף לוגיקה עסקית בצורה בוליאנית (לא, או, וגם).

English: Specification Design Pattern - UML diagram

Template method מגדיר שלד של אלגוריתם בפעולה, ומפנה חלק מן הצעדים לתת מחלקות. כך תת-מחלקות יכולות להגדיר מחדש צעדים מסוימים של האלגוריתם, ללא שינוי של המבנה שלו.

נשתמש כאשר:

  • נרצה לממש את החלקים הקבועים של האלגוריתם, ולאפשר למחלקות היורשות לקבוע את השאר.
  • נרצה לרכז את ההתנהגות המשותפת של תתי המחלקות במקום אחד, כדי למנוע שכפול קוד.
  • כשרוצים לשלוט בהרחבות המבוצעות על ידי המחלקות היורשות. ניתן להגדיר Template method הקורא לפעולות "עוגן" בנקודות מסוימות.

Template method UML Class Diagram

Visitor מייצג פעולה לביצוע על האלמנטים של מבנה האובייקט. בכך מאפשרת התבנית להגדיר פעולה חדשה ללא צורך לשנות את המחלקות של האלמנטים שעליהם היא מבוצעת.

נשתמש כאשר:

  • האובייקט מכיל מחלקות רבות עם ממשקים שונים, ורוצים לבצע פעולות התלויות במחלקות המממשות.
  • כאשר יש צורך להפעיל פעולות שונות ובלתי תלויות על האלמנטים המרכיבים את האובייקט, ורוצים להימנע מ"זיהום" המחלקות עם פעולות אלו. ה-Visitor מאפשר לשמור על פעולות דומות יחדיו, על ידי הגדרתם במחלקה אחת. כאשר מבנה האובייקט משותף למספר אפליקציות, ניתן להשתמש ב-Visitor כדי להכניס את הפעולות רק במקום בו הן נדרשות.

Visitor design pattern in the LePUS3 Design Description Language

התבנית Inversion of control אשר מאפשרת הזרקה של אובייקטים מתאימים בשלב ההרצה משמשת כתבנית הבסיסית למערכת התשתית הנפוצה Spring.

קישורים חיצוניים

הערות שוליים

  1. ^ תבניות עיצוב למתחילים (Design patterns for dummies), ספר מאת ברברה פורצ'ייס, סטיבן הולצ'נר
  2. ^ ספר מאת ראלף ג'ונסון, אריק גאמה וריצ'רד הלם, Design Patterns: Elements of Reusable Object-Oriented Software
  3. ^ A Pattern Language: Towns, Buildings, Construction, by Christopher Alexander
  4. ^ Using Pattern Languages for Object-Oriented Programs, c2.com
  5. ^ Patterns versus antipatterns
  6. ^ מדריך לתבניות עיצוב וסוגן
  7. ^ Abstract factory pattern - CodeDocs, codedocs.org (באנגלית)

Read other articles:

Forecasting Love and WeatherPoster promosiHangul기상청 사람들: 사내연애 잔혹사 편 Hanja氣象廳的人們:社內戀愛殘酷史篇 Alih Aksara yang DisempurnakanGisangcheong Salamdeul: Sanaeyeon-ae Janhogsa PyeonArtiMeteorological Agency People: The Cruelty of In-House Romance GenreDrama romantisPembuatKang Eun-kyeongDitulis olehSeon YeongSutradaraCha Young-hoonPemeranPark Min-youngSong KangYoon ParkYuraNegara asalKorea SelatanBahasa asliKoreaJmlh. episode16ProduksiDurasi70 m...

 

Joseph HergenrötherPengarsip Arsip Rahasia VatikanGerejaGereja Katolik RomaPenunjukan9 Juni 1879Masa jabatan berakhir3 Oktober 1890PendahuluJean Baptiste François PitraPenerusLuigi TripepiJabatan lainPrefek Arsip Rahasia Vatikan (1879–90)Kardinal-Deakon Santa Maria di Via Lata (1888–90)Protodeacon (1890)ImamatTahbisan imam28 Maret 1848oleh George Anton von StahlPelantikan kardinal12 Mei 1879oleh Paus Leo XIIIPeringkatKardinal-DeakonInformasi pribadiNama lahirJoseph HergenrötherLah...

 

Class of molluscs Bivalve redirects here. For other uses, see Bivalve (disambiguation). BivalviaTemporal range: Early Cambrian – recent[1][2] PreꞒ Ꞓ O S D C P T J K Pg N Acephala, from Ernst Haeckel's Kunstformen der Natur (1904) Scientific classification Domain: Eukaryota Kingdom: Animalia Phylum: Mollusca Class: BivalviaLinnaeus, 1758 Subclasses Heterodonta Palaeoheterodonta Protobranchia Pteriomorphia And see text Empty shell of the giant clam (Tridacna gigas) Empty s...

Inspektorat Jenderal Kementerian Keuangan Republik IndonesiaSusunan organisasiInspektur Jenderal[Awan Nurmawan Nuh]]Situs webhttp://itjen.kemenkeu.go.id/Inspektorat Jenderal Kementerian Keuangan Republik Indonesia atau disingkat dengan Itjen Kemenkeu RI merupakan unsur pengawas di Kementerian Keuangan Republik Indonesia. Itjen Kemenkeu RI dipimpin oleh seorang Inspektur Jenderal atau disingkat Irjen yang berada di bawah dan bertanggung jawab kepada Menteri Keuangan RI. Sejarah singkat In...

 

French painter Lydia CorbettSylvette, a 1970 Picasso sculpture in Rotterdam representing Lydia CorbettBornSylvette David (1934-11-14) 14 November 1934 (age 89)NationalityFrench Lydia Corbett (born Sylvette David, 14 November 1934)[1] is a French artist and former artist's model known for being the girl with the ponytail in Pablo Picasso's Sylvette series of paintings[2] and a 1970 sculpture. Early life Corbett was born Sylvette David in Paris[3] to an English moth...

 

Eurovision Song Contest 2016Country MoldovaNational selectionSelection processO melodie pentru Europa 2016Selection date(s)Semi-finals:23 February 201625 February 2016Final:27 February 2016Selected entrantLidia IsacSelected songFalling StarsSelected songwriter(s)Gabriel AlaresSebastian LestapierEllen BergLeonid GutkinFinals performanceSemi-final resultFailed to qualify (17th)Moldova in the Eurovision Song Contest ◄2015 • 2016 • 2017► Moldova partici...

Jurassic ParkEmpire ha classificato la scena dell'incontro con il Brachiosaurus come la 28ª scena più magica mai realizzata in un film[1]Paese di produzioneStati Uniti d'America Anno1993 Durata127 min Rapporto1,85:1 Genereavventura, fantascienza RegiaSteven Spielberg Soggettodal romanzo Jurassic Park di Michael Crichton SceneggiaturaMichael Crichton, David Koepp, Malia Scotch Marmo (non accreditata) ProduttoreKathleen Kennedy, Gerald R. Molen Casa di produzioneUniversal Pictures...

 

Questa voce o sezione sugli argomenti nobili francesi e militari francesi non cita le fonti necessarie o quelle presenti sono insufficienti. Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti. Segui i suggerimenti del progetto di riferimento. Questa voce o sezione sugli argomenti nobili e militari non è ancora formattata secondo gli standard. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i sugg...

 

Questa voce sull'argomento calciatori messicani è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. Javier Orozco Nazionalità  Messico Altezza 172 cm Peso 62 kg Calcio Ruolo Attaccante Termine carriera 2022 CarrieraSquadre di club1 2005-2010 Cruz Azul Hidalgo43 (22)2005-2013 Cruz Azul165 (62)2013-2016 Santos Laguna85 (24)2016-2017→  Chiapas12 (1)2017→  Veracruz6 (0)2017-2...

University of FloridaBoard of TrusteesTigert HallFormation2003TypeGoverning BoardHeadquartersGainesville, FloridaLocation United StatesChairMori HosseiniWebsiteOfficial website The University of Florida Board of Trustees is the governing body of the University of Florida and a member of the State University System of Florida. The University is located in Gainesville, Florida, United States. The current Chair of the Board is Mori Hosseini.[1] According to the official website, The Boar...

 

Міністерство оборони України (Міноборони) Емблема Міністерства оборони та Прапор Міністерства оборони Будівля Міністерства оборони у КиєвіЗагальна інформаціяКраїна  УкраїнаДата створення 24 серпня 1991Попередні відомства Міністерство оборони СРСР Народний комісарі...

 

American attorney and diplomat Constance MilsteinUnited States Ambassador to Malta IncumbentAssumed office October 27, 2022PresidentJoe BidenPreceded byG. Kathleen Hill Personal detailsNationalityAmericanEducationNew York University (BS)North Carolina Central University (JD) Constance J. Milstein is an American attorney and businesswoman who serves as the United States ambassador to Malta since October 2022. Early life and education Milstein earned her Bachelor of Science from New York Un...

密西西比州 哥伦布城市綽號:Possum Town哥伦布位于密西西比州的位置坐标:33°30′06″N 88°24′54″W / 33.501666666667°N 88.415°W / 33.501666666667; -88.415国家 美國州密西西比州县朗兹县始建于1821年政府 • 市长罗伯特·史密斯 (民主党)面积 • 总计22.3 平方英里(57.8 平方公里) • 陸地21.4 平方英里(55.5 平方公里) • ...

 

Sărmașu NagysármásKota Lambang kebesaranNegara RumaniaCountyCounty MureşStatus[[Kota {{{1}}}|{{{1}}}]]Pemerintahan • Wali kotaIoan Mocean (PNL)Populasi (2011) • Total6.833Zona waktuUTC+2 (EET) • Musim panas (DST)UTC+3 (EEST) Sărmașu (bahasa Hongaria: Nagysármás; pelafalan Hungaria: [’nɒɟʃaːrmaːʃ] ) adalah sebuah kota yang terletak di County Mureș, Transilvania tengah, Rumania. Secara administratif di kota ini terdapat tujuh d...

 

2013 apostolic exhortation by Pope Francis Evangelii gaudiumLatin for 'The Joy of the Gospel' Apostolic exhortation of Pope FrancisSignature date 24 November 2013 (2013-11-24)SubjectOn the proclamation of the Gospel in today's worldPages217Number1 of 7 of the pontificateOriginal language ItalianTextIn original languageIn EnglishAAS105 (12): 1019-1137← Ecclesia in Medio Oriente Amoris laetitia → Part of a series onCatholic social teachingEmb...

Genus of flowering plants Chloranthus Chloranthus fortunei Scientific classification Kingdom: Plantae Clade: Tracheophytes Clade: Angiosperms Order: Chloranthales Family: Chloranthaceae Genus: ChloranthusSw. Species See text Chloranthus is a genus of flowering plants in the family Chloranthaceae. It is the type genus of its family. They are perennial herbs or evergreen shrubs. with jointed stems, opposite, simple leaves, and small, inconspicuous flowers in slender, terminal spikes. They are f...

 

Federated state constitution from 1793 in Vermont, USA Vellum manuscript of the Constitution of Vermont, 1777. This constitution was amended in 1786, and replaced in 1793 following Vermont's admission to the federal union in 1791. Marble tablet with a passage from the Constitution of Vermont in the Hall of Inscriptions at the Vermont State House. The Constitution of the State of Vermont is the fundamental body of law of the U.S. state of Vermont, describing and framing its government. It was ...

 

Charlie and the Chocolate Factory Título Charlie y la fábrica de chocolateFicha técnicaDirección Tim BurtonProducción Brad GreyRichard D. ZanuckMichael SiegelGuion John AugustBasada en Charlie y la fábrica de chocolate de Roald DahlMúsica Danny ElfmanFotografía Philippe RousselotMontaje Chris LebenzonVestuario Gabriella PescucciNarrador Geoffrey HolderProtagonistas Johnny DeppFreddie HighmoreDavid KellyHelena Bonham CarterNoah TaylorMissi PyleJames FoxDeep RoyChristopher Lee Ver todos...

Gaya atau nada penulisan artikel ini tidak mengikuti gaya dan nada penulisan ensiklopedis yang diberlakukan di Wikipedia. Bantulah memperbaikinya berdasarkan panduan penulisan artikel. (Pelajari cara dan kapan saatnya untuk menghapus pesan templat ini) Artikel ini tidak memiliki referensi atau sumber tepercaya sehingga isinya tidak bisa dipastikan. Tolong bantu perbaiki artikel ini dengan menambahkan referensi yang layak. Tulisan tanpa sumber dapat dipertanyakan dan dihapus sewaktu-waktu.Cari...

 

Come leggere il tassoboxEuryarchaeotaHalobacteria sp.Classificazione scientificaDominioProkaryota RegnoArchaea PhylumEuryarchaeota Classi Archaeoglobi Halobacteria Methanobacteria Methanococci Methanomicrobia Methanopyri Methanosarcinae Thermococci Thermoplasmata Gli Euryarchaeota costituiscono il gruppo più grande appartenente al regno degli Archaea. Tra loro troviamo archebatteri che producono metano, organismi estremofili (come, ad esempio, alofili e ipertermofili), e organismi marini. In...