|
|
|
המטרה:
הרכבת אובייקטים לאובייקט מורכב יותר כך שהאובייקט המורכב והאובייקטים המרכיבים מצייתים לאותו ממשק. Composite מאפשרת לקליינט להתייחס לאובייקטים אינדיבידואלים ולהרכבות של אובייקטים בצורה אחידה.
מוטיבציה:
אפליקציות גרפיות שונות מאפשרות למשתמש לבנות דיאגרמות מורכבות שבנויות ממרכיבים פשוטים.
המשתמש יכול לקבץ מרכיבים על מנת ליצור מרכיבים גדולים יותר, ולקבץ את המרכיבים הגדולים יותר למרכיבים יותר גדולים, וכן הלאה.
יישום פשוט יכול היה להגדיר class ים לאלמנטים הגרפיים הבסיסיים כמו Text ו Lines ובתוספת להגדיר
class ים אחרים שיתפקדו כקונטיינרים ל class ים אלה.
ישנה בעיה בגישה זו: קוד שמשתמש ב class ים אלה צריך להתייחס לאלמנטים הגרפיים באופן שונה מאשר לקונטיינרים שלהם,
אפילו אם מרבית הזמן המשתמש מתייחס אליהם כזהים. הצורך להבחין בין שני סוגי class ים אלה הופך את האפליקציה ליותר מסובכת. ה
composite pattern מתארת כיצד להשתמש ב recursive composition כך שקליינטים לא יצטרכו לדעת ולהבחין בהבדל. למי שאינו זוכר כיצד להסתכל בדיאגרמה הבאה זה הזמן
להתרענן.
|
לחץ להגדלה - composite example
|
נקודת המפתח ב composite pattern הוא abstract class
שמייצג גם את המרכיבים הפרימיטיביים וגם את הקונטיינרים שלהם. במערכת הגרפית שלנו זה יהיה Graphic. Graphic מגדיר פעולות כמו
Draw() שהם ספציפיות לאובייקטים גרפיים. כמו כן הוא מגדיר פעולות כלליות שיש לאובייקטים שהם הרכבה של אובייקטים יותר פשוטים כמו גישה לילדים וטיפול בהם.
ה subclass ים Line, Rectangle, Text בציור מגדירים אובייקטים גרפיים בסיסיים. הם מממשים את פעולת Draw() כדי לצייר קו, מלבן וטקסט בהתאמה.
מכיוון שאלו אובייקטים בסיסיים ואינם הרכבה של אובייקטים פשוטים יותר, הם אינם מממשים את הפעולות שקשורות לטיפול בילדים.
Picture הוא aggregate של אובייקטים מסוג Graphic. לכן הוא מממש את Draw()
כביצוע Draw() על כל אחד מילדיו, והוא גם מממש את פעולות הטיפול בילדים בהתאם.
הנקודה היפה היא שמכיוון ש Picture מציית לממשק של Graphic הוא יכול לשמש גם בתפקיד של אובייקט בסיסי שמורכב יחד עם עוד אובייקטים לאובייקט מורכב יותר גדול (למשל Picture שמורכב מ Pictures אחרים באופן רקורסיבי).
הדיאגרמה הבאה מראה מבנה אופייני של אובייקט composite עבור אובייקטים מסוג Graphic אשר מורכבים רקורסיבית.
|
לחץ להגדלה - מבנה אופייני של אובייקט
|
אם אינכם זוכרים כיצד להסתכל בדיאגרמה זו זה הזמן להתרענן.
|
|
|
|