Kujundusmustrid - vaatleja mustri lühijuhend.

Vaatleja muster on väga sageli kasutatav muster. Tegelikult on see nii tavaline, et see on paljudes programmeerimiskeeltes / raamatukogudes standardiseeritud. Javas on see olemas injava.util.Observer (Java 9 aegunud). Pythonis on see nii lähedal apip installimustri vaatlejale. C ++ puhul võime mõnikord kasutada lisateekide teeki, täpsemalt #include . Kuid seda kasutatakse tööstuses laialdaselt eritellimusel valmistatud lahendusena. Et seda õigesti kasutada ja selle keerukusest aru saada, peame sellesse sukelduma ja seda uurima.

Vaatleja muster klassifitseeritakse käitumusliku kujunduse mustrite hulka. Käitumuslikud kujundusmustrid on konkreetsemalt seotud klasside / objektide vahelise suhtlusega. [kujundusmustrite järgi lihtsalt seletatud]

Mis on vaatleja muster? Peale kõndimismonitori, mis edastab analoogtelevisiooni (nagu pildil). Mustri eesmärk on määratleda suhe üks ühele nii, et kui ühe objekti olek muutub, teavitatakse teisi ja seda värskendatakse automaatselt. Täpsemalt soovib ta saada teavet süsteemis toimuvate sündmuste kohta. Paneme pusletükid kokku kolme sammuga.

1. samm - märksõnad

Selle lühijuhendite sarja salajane retsept on märksõnade määratlemine. See meetod aitas mul disainilahenduse mustreid tõeliselt mõista, neid kõvasti kodeerida ja mõista teiste disainimustrite erinevusi.

  1. Teema: teda peetakse teabe, andmete või äriloogika hoidjaks.
  2. Registreeri / manusta: Vaatlejad registreeruvad end subjektile, sest nad tahavad, et muutustest teatatakse.
  3. Sündmus: Sündmused toimivad subjektis nii, et sellest teavitatakse kõiki vaatlejaid.
  4. Teata. Sõltuvalt teostusest võib subjekt vaatlejatele teavet edastada või vaatlejad teavet tõmmata, kui nad vajavad subjektilt teavet.
  5. Värskendus: vaatlejad värskendavad oma olekut teistest vaatlejatest sõltumatult, kuid nende olek võib sõltuvalt käivitatud sündmusest muutuda.

2. samm - skeem

Jagage see kujundus erinevatesse klassidesse, et seda natuke lihtsustada.

  • ConcreteObservers on klassid, mis sisaldavad konkreetse eksemplari kohta konkreetset teavet. Uuendusfunktsiooni kutsub subjekti teavitus () toiming. Vaatlejad värskendavad iseseisvalt vastavalt oma hetkeseisule.
  • Vaatleja on konkreetsete vaatlejate vanemklass. See sisaldab teema esinemisjuhtu. Kui vaatleja initsieeritakse, registreerib / kinnistab ta end subjektiga.
  • Aineklassil on vaatlejate nimekiri või kogum. Kui sündmus käivitatakse, kutsub see teate () toimingu, mis viib kõik vaatlejad läbi, kutsudes nende värskendusfunktsiooni.

3. samm - kood näite järgi

Ma soovitaksin koodiklassi klasside kaupa kopeerida minu git-hoidlast “Andreas Poyias” või allpool olevatest lõikudest (pakutavas järjekorras) ja kleepida see mõnda olemasolevasse veebis olevasse C ++-redaktorisse, näiteks c ++ kest, jdoodle, onlineGDB ja käivitada väljundi jälgimiseks. Seejärel lugege allolevaid kommentaare või kirjeldust. Võtke aega, lugedes seda põhjalikult (see tähendab üks minut, mitte vähem ja mitte rohkem).

Näide: kaaluge jalgpallimängu. Mängu vaatavad paljud toetajad. Jagasime toetajad vanuse järgi kahte kategooriasse: noored ja vanad. Kui nende meeskond lööb värava, reageerivad toetajad vastavalt vanusele ja põnevustasemele erinevalt.
Räägime nüüd vaatleja mustri jaoks kasutatud mõistetest:

  • Mäng on teema ja toetajad on vaatlejad.
  • Kõik vaatlejad on subjektiga seotud / registreeritud ja neile teatatakse, kui nende jalgpallimeeskond skoorib (stardisündmus on see, kui nende meeskond skoorib).
  • Vaatlejad ajakohastavad oma käitumist sõltuvalt saadud teatisest.

Teema
Selle klassi jaoks on meil vaja juurdepääsu vaatlejate nimekirjale. Kui vaatlejad registreeruvad, kutsuvad nad funktsiooni Theattach (see), et lisada end olemasolevasse loendisse (see on vaatleja näide). Kui sündmus käivitatakse, wenotify () kõik vaatlejad, et iseseisvalt värskendada oma olekut. Selles näites on päästik juhul, kui vaatleja jalgpallimeeskond lööb.

# hõlmama 
# hõlmab 
nimeruumi std kasutamine;
klassi õppeaine {
    vektori  vaatlejad;
    loll viskas; // päästik, sündmus
avalik:
    // registreerige vaatlejaid
    tühine kinnitamine (vaatleja * obs) {
        vaatlejad.push_back (obs);
    }
   
   // See on SÜNDMUS
   // määrake skoor ja teatage sellest kõigile vaatlejatele
   void setScored (hullu skoor) {
      skooritud = skoor;
      teatama ();
   }
bool getScored () {
      tagasituleku tulemus;
   }
   // teata rakendamisest on allpool
   // nii, et skript kompileeritakse ja käivitatakse
   tühine teatama ();
};

Vaatleja
See klass sõltub õppeainest, milles ta on registreeritud. Kui konkreetsed vaatlejad saavad alguse, kinnituvad nad teema juurde. Selles näites on iga vaatleja olek tema põnevusLaadame mängu edasi.

klassi vaatleja
{
    Teema * subj;
    int erutusLevel; // osariik
  avalik:
    Vaatleja (teema * mod, int excLevel)
    {
        subj = mod;
        excitementLevel = excLevel;
        // Vaatlejad registreerivad end / registreerivad end subjektiga
        subj-> kinnitama (see);
    }
    virtuaalne tühine värskendus () = 0;
  kaitstud:
    Teema * getSubject () {
       tagasi subj;
    }
    void setExcitementLevel (int excLevel) {
       excitementLevel = excLevel;
    }
    int getExcitementLevel () {
       tagasi põnevusLisand;
    }
};

See on TheSubject :: teavita () deklaratsioon ja nagu me juba enne mainisime, on selle ülesanne teavitada kõiki vaatlejaid oma oleku värskendamiseks.

tühine teema :: teata () {
  jaoks (int i = 0; i  värskendama ();
}

Betoonivaatlejad
Konkreetsed vaatlejad pärivad vaatleja klassilt ja neil kõigil peab olema värskendusfunktsioon. Selles näites eristatakse konkreetseid vaatlejaid noorte ja vanade toetajate vahel. Kui nende põnevustase tõuseb liiga kõrgeks, on vanematel toetajatel südameatakkide oht ja noorematel joove ja autojuhtimise oht. Nende olekut värskendatakse iseseisvalt, nagu allpool näidatud põhifunktsiooni puhul tõestame.

klass Old_ConcreteObserver: avalik vaatleja
{
   avalik:
     // kutsub vanemkonstruktorit registreeruma subjektiga
     Old_ConcreteObserver (teema * mod, int div)
        : Vaatleja (mod, div) {}
     // Vanematele inimestele, kui põnevustase
     // kui on üle 150, on neil südameinfarkti oht
     tühine värskendus ()
     {
        bool viskas = getSubject () -> getScored ();
        setExcitementLevel (getExcitementLevel () + 1);
        if (skooritud && getExcitementLevel ()> 150)
        {
          cout << "Vana vaatleja meeskond viskas !!"
               << "Tema põnevustase on"
               << getExcitementLevel ()
               << "olge südameatakkide eest!" << endl;
        } veel {
          cout << "Meeskond ei löönud. Yeeeih pole millegi pärast muretseda"
               << endl;
        }
    } // lõpeta värskendus ()
};
klass Young_ConcreteObserver: avalik vaatleja
{
   avalik:
     // kutsub vanemkonstruktorit registreeruma subjektiga
     Young_ConcreteObserver (teema * mod, int div)
       : Vaatleja (mod, div) {}
     // Vanematele inimestele, kui põnevustase
     // kui neid on üle 100, on neil südameinfarkti oht
     tühine värskendus ()
     {
        bool viskas = getSubject () -> getScored ();
        setExcitementLevel (getExcitementLevel () + 1);
        if (hinnatud && getExcitementLevel ()> 100)
        {
          cout << "Noore vaatleja meeskond viskas !!"
               << "Tema põnevustase on"
               << getExcitementLevel ()
               << "ära joo ja sõida !!" << endl;
        } veel {
          cout << "Meeskond ei löönud väravat. Jah, pole millegi pärast muretseda"
               << endl;
       }
    } // lõpeta värskendus ()
};

Põhifunktsioon
Konkreetsed vaatlejad registreerivad end teemakohtule. Nende olek on põnevustase, mis on teine ​​parameeter. Kui sündmus käivitatakse “subj.setScored (true)”, kutsutakse registreeritud vaatlejaid värskendamaSubject :: teavitama (). Allpool toodud stsenaariumi kohaselt on meil kolm vaatlejat: youngObs1 on ülepaisutatud ja sellega kaasneb joobes ning autojuhtimise oht, ka oldObs1 on ülepaisutatud ja sellel on erinev risk (südameatakk). Lõpuks pole youngObs2-l, kes on ka noor juba esimesena, muretseda, kuna ta pole ülepakutud.

Oluline on tähele panna, et kolm vaatlejat värskendasid iseseisvalt olekut (põnevustase) ja tüüpi (noored või vanad).
int main () {
   Subjekti subj;
   Young_ConcreteObserver youngObs1 (& subj, 100);
   Old_ConcreteObserver oldObs1 (& subj, 150);
   Young_ConcreteObserver youngObs2 (& subj, 52);
   subj.setScored (tõene);
}
// väljund
// Noore vaatleja meeskond viskas !! Tema põnevustase on 101
// ära joo ja sõida !!
// Vana vaatleja meeskond viskas !! Tema põnevustase on 151 kella
// südamerabandustest väljas! Meeskond ei löönud.
// Yeeh, pole vaja muretseda

Vaatleja mustri kasutamisel on mõned eelised ja mõned punktid, mida tuleb sellele mustrile lähenedes tähele panna [Pythoni kujundusmustrite õppimine].

  • Vaatleja muster loob kujunduse, kus subjekt ja vaatleja on lõdvalt ühendatud. Aine ei pea tundma ConcreteObserveri klassi. Uusi vaatlejaid saab igal ajal lisada. Uue vaatleja lisamisel pole objekti vaja muuta. Vaatlejad ja katsealused ei ole seotud ja on üksteisest sõltumatud, seetõttu ei mõjuta muutused subjektis ega vaatlejas üksteist.
  • Kompositsioonil pole valikut, kuna vaatleja liidest saab kiirendada.
  • Kui vaatlejat kuritarvitatakse, võib see hõlpsalt lisada keerukust ja põhjustada jõudlusprobleeme.
  • Teated võivad olla ebausaldusväärsed ja põhjustada võistlustingimusi või vastuolusid.

Järgmine ajaveeb on Silla kujundusmustri kiire juhend. See on konstruktsiooniline muster, mida tööstuses kasutatakse üsna palju. Ärge unustage, et mulle meeldib mu blogi postitus / plaksutada ja minu kontot jälgida. See annab mulle rahulolu, et aitasin mõnda arendajat ja ajendasin mind kirjutama. Kui teil on mõni konkreetne kujundusmuster, mille kohta soovite teada saada, andke mulle sellest teada, et saaksin selle teile tulevikus pakkuda.

Muud kujundusmustrite lühijuhendid:

  1. Kujundusmustrid - abstraktvabriku lühijuhend.
  2. Kujundusmustrid - sillamustri lühijuhend.
  3. Kujundusmustrid - ehitaja mustri lühijuhend.
  4. Kujundusmustrid - dekoraatori mustri lühijuhend.
  5. Kujundusmustrid - fassaadimustri lühijuhend.
  6. Kujundusmustrid - vaatleja mustri lühijuhend.
  7. Kujundusmustrid - Singletoni mustri lühijuhend.