דפוסי עיצוב - מדריך מהיר לדפוס התבוננים.

דפוס התבוננות הוא תבנית נפוצה מאוד. למעשה, זה כל כך נפוץ שמתקבל על ידי שפות / ספריות תכנות רבות. ב- Java זה קיים injava.util.Observer (הוצא משימוש ב- Java 9). בפיתון זה קרוב כמו מתבונן בהתקנה של apip. ב- C ++, אנו יכולים לפעמים להשתמש בספריית boost, ליתר דיוק # כלול . עם זאת, הוא משמש בתעשייה כפתרון בהתאמה אישית. כדי להיות מסוגלים להשתמש בו נכון ולהבין את המורכבות שלו, עלינו לצלול פנימה ולחקור אותה.

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

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

שלב 1 - מילות מפתח

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

  1. נושא: זה נחשב כשומר מידע, נתונים או היגיון עסקי.
  2. הרשמה / צרף: משקיפים רושמים עצמם לנושא מכיוון שהם רוצים לקבל הודעה כשיש שינוי.
  3. אירוע: אירועים פועלים כטריגר בנושא כך שכל הצופים מקבלים הודעה.
  4. הודע: בהתאם ליישום, הנבדק עשוי "לדחוף" מידע לתצפיות, או, הצופים עשויים "למשוך" אם הם זקוקים למידע מהנושא.
  5. עדכון: משקיפים מעדכנים את מצבם באופן עצמאי ממשקיפים אחרים, אולם מצבם עשוי להשתנות בהתאם לאירוע המופעל.

שלב 2 - תרשים

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

  • ConcreteObservers הם שיעורים המכילים מידע ספציפי למופע הנוכחי. פונקציית העדכון נקראת על ידי פעולת ההודעה () של הנבדק. הצופים מתעדכנים באופן עצמאי בהתבסס על מצבם הנוכחי.
  • הצופה הוא כיתת האב של המתבוננים המוחשיים. הוא מכיל מופע נושא. כאשר צופה מאתחל הוא רושם / מצמיד עצמו לנושא.
  • בכיתת הנושאים רשימה או אוסף של צופים. כאשר מופעל אירוע הוא מתקשר לפעולת ההודעות () שמעבירה בין כל הצופים על ידי קריאה לפונקציית העדכון שלהם.

שלב 3 - קוד לפי דוגמה

הייתי מציע להעתיק את מחלקת הקוד לפי כיתות ממאגר ה- Git שלי "Andreas Poyias" או מהקטעים למטה (בסדר המצורף) ולהדביק אותו בכל אחד מהעורכים המקוונים C ++ הזמינים כמו c ++ shell, jdoodle, onlineGDB ולהפעיל אותו זה כדי לצפות בתפוקה. לאחר מכן קרא את ההערות או התיאור שלהלן. קח את הזמן שלך וקרא אותו לעומק (זה אומר דקה, לא פחות ולא יותר).

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

  • המשחק הוא הנושא והתומכים הם המשקיפים.
  • כל הצופים מחוברים / רשומים לנושא והם מקבלים הודעה כאשר ציון קבוצת הכדורגל שלהם (אירוע ההדק הוא אם ציוני הקבוצה שלהם).
  • הצופים מעדכנים את התנהגותם בהתאם להודעות שהתקבלו.

נושא
לשיעור זה אנו זקוקים לגישה לרשימת התצפיתנים. כאשר הצופים עומדים להירשם, הם קוראים לתפקוד theattach (זה) כדי להוסיף את עצמם לרשימה הזמינה (זהו מקרה של צופה). כאשר אירוע מופעל wenotify () כל הצופים לעדכן באופן עצמאי את מצבם. בדוגמה זו, ההדק הוא אם קבוצת הכדורגל של הצופה קלעה.

# כלול <זרם>
# כלול 
שימוש במרחב השמות std;
נושא בכיתה {
    וקטור  משקיפים;
    בול קלע; // טריגר, אירוע
ציבורי:
    // לרשום משקיפים
    void attach (Observer * obs) {
        observers.push_back (obs);
    }
   
   // זה האירוע
   // הגדר את הניקוד אם והודיע ​​לכל הצופים
   void setScored (ציון bool) {
      קלע = ציון;
      להודיע ​​();
   }
bool getScored () {
      החזר קלע;
   }
   // הודע ליישום נמצא למטה
   // כך שהתסריט אוצר ומופעל
   הודעה בטלה ();
};

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

משקיף בכיתה
{
    נושא * subj;
    התרגשות אינטל ברמה; // מדינה
  ציבורי:
    צופה (נושא * mod, int excLevel)
    {
        subj = mod;
        התרגשות = excLevel;
        // משקיפים רושמים / מצמידים עצמם לנושא
        subj-> צרף (זה);
    }
    עדכון חלל וירטואלי () = 0;
  מוגן:
    נושא * getSubject () {
       subj להחזיר;
    }
    void setExcitationLevel (int excLevel) {
       התרגשות = excLevel;
    }
    int getExcitationLevel () {
       התרגשות חזרה
    }
};

זוהי הצהרת theSubject :: Notify () וכפי שהזכרנו לפני תפקידו להודיע ​​לכל הצופים לעדכן את מצבם.

נושא בטל :: הודע () {
  עבור (int i = 0; i  עדכון ();
}

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

כיתה Old_ConcreteObserver: Public Observer
{
   ציבורי:
     // קורא לבנאי ההורים להירשם לנושא
     Old_ConcreteObserver (נושא * mod, int div)
        : צופה (mod, div) {}
     // עבור אנשים מבוגרים, אם רמת ההתרגשות
     // הם מעל 150 הם מסתכנים בהתקף לב
     עדכון בטל ()
     {
        scool bool = getSubject () -> getScored ();
        setExcitationLevel (getExcitationLevel () + 1);
        אם (ציון & קבל getExcitationLevel ()> 150)
        {
          cout << "הקבוצה הישנה של Observer הבקיעה !!"
               << "רמת ההתרגשות שלו היא"
               << getExcitationLevel ()
               << "היזהר מהתקפי לב!" << endl;
        } אחרת {
          cout << "הצוות לא קלע. יהיה שום דבר לדאוג"
               << endl;
        }
    } // עדכון סיום ()
};
כיתת Young_ConcreteObserver: Public Observer
{
   ציבורי:
     // קורא לבנאי ההורים להירשם לנושא
     Young_ConcreteObserver (נושא * mod, int div)
       : צופה (mod, div) {}
     // עבור אנשים מבוגרים, אם רמת ההתרגשות
     // הם מעל 100 הם מסתכנים בהתקף לב
     עדכון בטל ()
     {
        scool bool = getSubject () -> getScored ();
        setExcitationLevel (getExcitationLevel () + 1);
        אם (ציון && getExcitationLevel ()> 100)
        {
          cout << "הצוות של הצופה הצעיר הבקיע !!"
               << "רמת ההתרגשות שלו היא"
               << getExcitationLevel ()
               << "אל תשתה ותנהג !!" << endl;
        } אחרת {
          cout << "הצוות לא קלע. יה שום דבר לדאוג"
               << endl;
       }
    } // עדכון סיום ()
};

פונקציה עיקרית
משקפי הבטון רושמים את עצמם למופע הסובייקט. מצבם הוא רמת ההתרגשות שהיא הפרמטר השני. כאשר האירוע מופעל "subj.setScored (true)", אז נקראת Subject :: notify () לעדכון הצופים הרשומים. בתרחיש שלמטה, יש לנו שלושה צופים, ה- Obs1 הצעיר הוא מוגזם מדי ומסכן סיכון של שתייה ונהיגה, OldObs1is גם הגיח יתר על המידה שהוא מהווה סיכון שונה (להתקף לב). לבסוף, YoungObs2 שהוא גם צעיר כראשון אין לו מה לדאוג מכיוון שהוא לא נלהב יתר על המידה.

חשוב לשים לב כי שלושת הצופים התעדכנו באופן עצמאי בהתבסס על מצבם (רמת ההתרגשות) וסוגם (צעיר או זקן).
int main () {
   נושא משנה;
   Young_ConcreteObserver youngObs1 (& subj, 100);
   Old_ConcreteObserver oldObs1 (& subj, 150);
   Young_ConcreteObserver youngObs2 (& subj, 52);
   subj.setScored (נכון);
}
// תפוקה
// הקבוצה של הצופה הצעיר הבקיעה !! רמת ההתרגשות שלו היא 101
// אל תשתו ותנהגו !!
// הקבוצה הישנה של Observer הבקיעה !! רמת ההתרגשות שלו היא 151 צפיות
// מתוך התקפי לב! הקבוצה לא קלעה.
// יה שום דבר לדאוג

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

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

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

מדריכים מהירים אחרים לדפוסי עיצוב:

  1. דפוסי עיצוב - מדריך מהיר למפעל מופשט.
  2. דפוסי עיצוב - מדריך מהיר לדפוס Bridge.
  3. דפוסי עיצוב - מדריך מהיר לדפוס בונה.
  4. דפוסי עיצוב - מדריך מהיר לדפוס מעצבים.
  5. דפוסי עיצוב - מדריך מהיר לדפוס חזית.
  6. דפוסי עיצוב - מדריך מהיר לדפוס התבוננים.
  7. דפוסי עיצוב - מדריך מהיר לדפוס סינגלטון.