|
|
|
המטרה:
הגדרת משפחה של אלגוריתמים, ריכוז של כל אלגוריתם ב class
משלו, כך שניתן יהיה להחליף ביניהם בהתאם לצורך. Strategy מאפשרת לאלגוריתמים להשתנות באופן שהוא בלתי תלוי בקליינט שמשתמש בהם.
ידועה גם בתור: Policy
מוטיבציה:
קיימים אלגוריתמים רבים עבור שבירת stream של טקסט לשורות. הכנסת כל האלגוריתמים הללו ל
class ים שנזקקים להם אינה רצויה ממספר סיבות:
- קליינטים אשר נזקקים לשבירת טקסט לשורות נהיים יותר מסובכים אם הם כוללים בתוכם את הקוד לכך. הם גדלים ונהיים קשים יותר לתחזוקה, בייחוד אם הם תומכים במספר אלגוריתמים לשבירה לשורות.
- אלגוריתמים שונים יתאימו לשימוש במקרים שונים בזמנים שונים. לא נרצה לתמוך במספר אלגוריתמים לשבירת שורות אם רב הזמן לא נזדקק לכולם.
- כאשר האלגוריתמים לשבירת שורות הם חלק אינטגרלי מהקליינט, קשה יותר להוסיף אלגוריתמים חדשים ולשנות אלגוריתמים קיימים.
כעת אנחנו יודעים מה לא לעשות. אבל מה כן לעשות??
הפתרון:
נוכל להימנע מבעיה זו על ידי הגדרת class ים שמרכזים בתוכם אלגוריתמי שבירת שורות שונים. אלגוריתם שמרוכז בתוך
class באופן כזה נקרא
strategy.
|
לחץ להגדלה - strategy exapmle
|
אם אינכם זוכרים את הסימונים בדיאגרמה זה הזמן להתרענן.
נניח שהמחלקה Composition אחראית לתחזוקה ועדכון של שבירת השורות בטקסט שמוצג בעורך כלשהו. האסטרטגיות לשבירת שורות אינן ממומשות במחלקה
Composition. הן ממומשות בנפרד על ידי subclasses של המחלקה האבסטרקטית
Compositor. ה subclass ים של Compositor
מממשים אסטרטגיות שונות:
- SimpleCompositor - מממש אסטרטגיה פשוטה שקובעת את נקודות שבירת השורות אחת אחת לפי הסדר.
- TeXCompositor - מממש את אלגוריתם הTeX עבור מציאה של נקודות השבירה. אסטרטגיה זו מנסה לבצע אופטימיזציה בצורה גלובלית, כלומר פסקה שלמה בו זמנית.
- ArrayCompositor - מממש אסטרטגיה שבוחרת שבירות כך שבכל שורה יש מספר קבוע של פריטים. זה שימושי למשל במקרים שנרצה לסדר אוסף של צלמיות (icons) בשורות.
|
|
|
|