ראשי > template method pattern > חלק שלישי
The Template Method

כמה נקודות בקשר למימוש:
  • שימוש בבקרת הגישה של ++C - ב ++C הפעולות הפרימיטיביות ש template method קוראת להן יכולות להיות מוגדרות כ protected members. זה יבטיח לנו שהן יקראו רק על ידי ה template method. פעולות פרימיטיביות אשר חייבות להידרס יוגדרו כ pure virtual. ה template method עצמה לא אמורה להידרס, ולכן אפשר להגדיר אותה כפונקציה לא ווירטואלית.
  • כמה שפחות פעולות פרימיטיביות - מטרה חשובה בעיצוב של template methods היא להפחית את מספר הפעולות הפרימיטיביות אשר subclass חייב לדרוס על מנת לממש את האלגוריתם.
  • מוסכמות לקריאת שמות - ניתן לזהות את הפעולות שיש לדרוס אותן על ידי הוספת קידומת לשמם. למשל את הקידומת "Do": כמו ב DoCreateDocument() וכו'.
למעלה
קוד לדוגמה:
הדוגמה הבאה ב ++C מראה איך parent class יכול לקבוע תכונות מסוימות בפעולות של ה subclass ים שלו. ניקח מחלקה View שתומכת בציור על מסך. View מכריחה את התכונה שה subclass ים שלה יכולים לצייר רק אחרי שהם ב"פוקוס", כלומר במצב מסוים שמאפשר לצייר (למשל לאחר שנקבעו צבעים, פונטים וכו').
אפשר להשתמש ב template method אשר תיקרא Display() כדי להבטיח תכונה זו. View יגדיר שתי concrete operations, שיקראו SetFocus() ו ResetFocus(), הראשונה מאתחלת את המצב והשניה מנקה אותו. ל View יש גם hook operation שנקראת DoDisplay() שמבצעת את פעולת הציור עצמה. Display() קוראת ל SetFocus() לפני הקריאה ל DoDisplay() כדי לקבוע את המצב לציור, והיא קוראת בסוף ל ResetFocus() כדי לנקות את המצב:

void View::Display() {
     SetFocus();
     DoDisplay();
     ResetFocus();
}

כדי לשמור על תכונה זו הקליינטים של View תמיד קוראים ל Display() וה subclass ים של View תמיד דורסים את DoDisplay() ומממשים אותה מחדש. DoDisplay() עצמה לא עושה כלום ב View:

void View::DoDisplay() { }

subclass ים דורסים אותה כדי להוסיף את ההתנהגות הספציפית להם של איך לצייר:

void MyView::DoDisplay() {
     // render the view's contents
}



למעלה







 
מה בעמוד:
 
מימוש
קוד לדוגמה