שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2024 - ממשקים
נתון קטע קוד הבא.
איזו תבנית עיצוב הקוד הנתון מממש?
סמנו תשובה אחת שהינה הנכונה ביותר.
א. Observer
ב. Factory
ג. Decorator
ד. Builder
נמקו את התשובה סימנתםן.
איזו תבנית עיצוב הקוד הנתון מממש?
סמנו תשובה אחת שהינה הנכונה ביותר.
א. Observer
ב. Factory
ג. Decorator
ד. Builder
נמקו את התשובה סימנתםן.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2024סמסטר א
★★★★★
ממשקיםמחלקות מופשטותירושהפולימורפיזםOverridingמעקב אחר קוד
שימו לב כיצד המחלקה
PrettyShape ומחלקות שיורשות ממנה (כמו RedShape) עוטפות אובייקט קיים מסוג Shape ומוסיפות לו התנהגות.התשובה הנכונה היא ג', Decorator.
תבנית העיצוב Decorator (מקשט) מאפשרת להוסיף פונקציונליות חדשה לאובייקטים קיימים באופן דינמי, מבלי לשנות את המחלקות שלהם. התבנית ממומשת על ידי יצירת מחלקות "מקשטות" (decorators) העוטפות את האובייקט המקורי.
בקטע הקוד הנתון, ניתן לזהות את המרכיבים של תבנית ה-Decorator:
1. Component: הממשק
2. Concrete Component: המחלקה
3. Decorator (Abstract): המחלקה המופשטת
4. Concrete Decorator: המחלקה
לדוגמה, ניתן ליצור אובייקט
קריאה ל-
תבנית העיצוב Decorator (מקשט) מאפשרת להוסיף פונקציונליות חדשה לאובייקטים קיימים באופן דינמי, מבלי לשנות את המחלקות שלהם. התבנית ממומשת על ידי יצירת מחלקות "מקשטות" (decorators) העוטפות את האובייקט המקורי.
בקטע הקוד הנתון, ניתן לזהות את המרכיבים של תבנית ה-Decorator:
1. Component: הממשק
Shape. זהו הממשק המשותף הן לאובייקט שאותו נעטוף והן למקשטים עצמם.2. Concrete Component: המחלקה
Circle. זוהי מחלקה קונקרטית המממשת את הממשק Shape ומייצגת את האובייקט הבסיסי שאליו נוסיף פונקציונליות.3. Decorator (Abstract): המחלקה המופשטת
PrettyShape. מחלקה זו מממשת גם היא את הממשק Shape, ומכילה רפרנס (obj) לאובייקט אחר מסוג Shape. המתודה draw שלה פשוט קוראת למתודה draw של האובייקט העטוף. תפקידה הוא לשמש כמחלקת בסיס לכל המקשטים הקונקרטיים.4. Concrete Decorator: המחלקה
RedShape. מחלקה זו יורשת מ-PrettyShape ומוסיפה פונקציונליות חדשה. המתודה draw שלה קודם כל קוראת ל-super.draw() (שבתורו קורא למתודה draw של האובייקט העטוף), ולאחר מכן מוסיפה את ההתנהגות החדשה - הדפסת הגבול האדום באמצעות קריאה ל-setRedBorder().לדוגמה, ניתן ליצור אובייקט
Circle ולעטוף אותו ב-RedShape כדי להוסיף לו גבול אדום באופן דינמי:Shape decoratedCircle = new RedShape(new Circle());קריאה ל-
decoratedCircle.draw() תדפיס תחילה "drawing B" (מהאובייקט Circle המקורי) ולאחר מכן "border color: red" (מהמקשט RedShape).