Dizaino modeliai - trumpas „Stebėtojo“ modelio vadovas.

Stebėtojo modelis yra labai dažnai naudojamas modelis. Tiesą sakant, tai yra labai įprasta, kad standartizuojama daugelyje programavimo kalbų / bibliotekų. „Java“ sistemoje jis egzistuoja „injava.util.Observer“ (nebenaudojamas „Java 9“). „Python“ programoje jis yra taip arti, kaip „apip“ diegimo modelio stebėtojas. „C ++“ sistemoje kartais galime naudoti „boost“ biblioteką, tiksliau # įtraukdami . Tačiau jis yra plačiai naudojamas pramonėje kaip individualus sprendimas. Kad galėtume teisingai naudotis ja ir suprasti jos sudėtingumą, turime pasinerti ir tyrinėti.

Stebėtojo modelis priskiriamas elgesio modelio tipams. Elgesio modeliai yra konkrečiai susiję su bendravimu tarp klasių / objektų. [paprasčiausiai paaiškino dizaino modeliai]

Kas yra stebėtojo modelis? Išskyrus vaikščiojantį monitorių, kuris transliuoja analoginę televiziją (kaip paveikslėlyje). Šablono tikslas yra apibrėžti santykį „vienas su daugeliu“ taip, kad pasikeitus vieno objekto būsenai, kiti būtų informuojami ir atnaujinami automatiškai. Tiksliau, ji nori būti informuota apie įvykius, vykstančius sistemoje. Galėsime sudėti galvosūkio dalis trimis etapais.

1 žingsnis - raktiniai žodžiai

Raktinių žodžių apibrėžimas yra slaptas šios greitųjų vadovų serijos receptas. Šis metodas padėjo man iš tikrųjų suprasti dizaino modelius, juos sunkiai koduoti ir suvokti kitų dizaino modelių skirtumus.

  1. Objektas: laikomas informacijos, duomenų ar verslo logikos saugotoju.
  2. Registracija / Prisegimas: Stebėtojai prisiregistruoja prie subjekto, nes nori pranešti, kai pasikeičia.
  3. Įvykis: įvykiai veikia kaip subjektas, kuris praneša apie tai visiems stebėtojams.
  4. Pranešti: atsižvelgiant į įgyvendinimą, subjektas gali „perduoti“ informaciją stebėtojams arba stebėtojai gali „traukti“, jei jiems reikia informacijos iš tiriamojo.
  5. Atnaujinimas: Stebėtojai atnaujina savo būseną nepriklausomai nuo kitų stebėtojų, tačiau jų būsena gali keistis priklausomai nuo suaktyvėjusio įvykio.

2 žingsnis - diagrama

Padalinsime šį dizainą į skirtingas klases, kad šiek tiek supaprastintume.

  • „ConcreteObserver“ yra klasės, kuriose yra informacijos, būdingos dabartinei instancijai. Atnaujinimo funkcija iškviečiama subjekto pranešimo () operacija. Stebėtojai atnaujina informaciją nepriklausomai nuo jų esamos būklės.
  • Stebėtojas yra pagrindinė konkrečių stebėtojų klasė. Joje yra dalyko egzempliorius. Kai stebėtojas yra inicializuotas, jis registruojasi / prisijungia prie subjekto.
  • Dalyko klasėje yra stebėtojų sąrašas arba rinkinys. Kai įvykis suaktyvinamas, jis iškviečia pranešimą () operaciją, kurios metu visi stebėtojai iškviečiami į jų atnaujinimo funkciją.

3 žingsnis. Kodas pagal pavyzdį

Aš siūlyčiau nukopijuoti kodų klasę po klases iš savo „Git“ saugyklos „Andreas Poyias“ arba žemiau pateiktų fragmentų (nustatyta tvarka) ir įklijuoti jį į bet kurį iš galimų internetinių C ++ redaktorių, pavyzdžiui, „C ++“ apvalkalą, „jdoodle“, „onlineGDB“ ir paleisti tai stebėti išėjimą. Tada perskaitykite komentarus ar aprašymą žemiau. Neskubėkite, nuodugniai perskaitę (tai reiškia vieną minutę, ne mažiau ir ne daugiau).

Pavyzdys: apsvarstykite futbolo žaidimą. Žaidimą stebi daugybė sirgalių. Rėmėjus suskirstėme į dvi kategorijas pagal amžių: jaunus ir senus. Kai jų komanda įmuša įvartį, sirgaliai reaguoja skirtingai, atsižvelgiant į jų amžių ir jaudulį.
Dabar pakalbėkime su terminais, kurie naudojami stebėtojo modeliui:

  • Žaidimas yra tema, o sirgaliai - stebėtojai.
  • Visi stebėtojai yra pritvirtinti / užregistruoti prie tiriamojo dalyko ir jiems pranešama, kai jų futbolo komanda įvertina rezultatą (įvykis, kai jų komanda vertina rezultatą).
  • Stebėtojai atnaujina savo elgesį, atsižvelgiant į gautą pranešimą.

Tema
Šiai klasei mums reikia prieigos prie stebėtojų sąrašo. Kai stebėtojai ruošiasi registruotis, jie paskambina „Theattach“ (tai) funkcijai, kad prisidėtų prie turimo sąrašo (tai yra stebėtojo pavyzdys). Kai įvyksta įvykis, wenotify () visi stebėtojai gali savarankiškai atnaujinti savo būseną. Šiame pavyzdyje trigeris yra tas, jei stebėtojo futbolo komanda įmušė įvartį.

# įtraukti 
# įtraukti 
naudojant vardų sritį;
klasės dalykas {
    vektoriai  stebėtojai;
    bolis įmuštas; // gaidukas, įvykis
viešas:
    // registruoti stebėtojus
    void pride (Stebėtojas * obs) {
        stebėtojai.push_back (obs);
    }
   
   // Tai yra RENGINYS
   // nustatykite, jei įvertintas, ir informuokite VISUS stebėtojus
   void setScored (balas balas) {
      įvertintas = balas;
      pranešti ();
   }
bool getScored () {
      sugrąžintas rezultatas;
   }
   // praneškite apie įgyvendinimą žemiau
   // kad scenarijus sudarytų ir paleistų
   void pranešti ();
};

Stebėtojas
Ši klasė priklauso nuo dalyko, kuriame ji yra užregistruota. Pradėję konkrečių stebėtojų darbą, jie prisistato prie objekto. Šiame pavyzdyje kiekvieno stebėtojo būsena yra jo jaudulysLevelabout the game.

klasės stebėtojas
{
    Dalykas * subj;
    int excitementLevel; // valstybė
  viešas:
    Stebėtojas (Tema * mod, int excLevel)
    {
        subj = mod;
        excitementLevel = excLevel;
        // Stebėtojai registruojasi / prisijungia prie subjekto
        subj-> prisegti (tai);
    }
    virtualus void update () = 0;
  saugoma:
    Tema * getSubject () {
       grįžti subj;
    }
    void setExcitementLevel (int excLevel) {
       excitementLevel = excLevel;
    }
    int getExcitementLevel () {
       grąžinti jaudulįLygiai;
    }
};

Tai yra „TheSubject :: Pranešti () deklaracija ir, kaip minėjome prieš tai, jos užduotis yra pranešti visiems stebėtojams, kad jie atnaujintų savo būklę.

negaliojantis tema :: pranešti () {
  už (int i = 0; i  atnaujinti ();
}

Betono stebėtojai
Betono stebėtojai paveldi iš stebėtojų klasės ir visi jie turi atlikti atnaujinimo funkciją. Šiame pavyzdyje konkretūs stebėtojai išskiriami iš jaunų ir senų rėmėjų. Jei jų susijaudinimo lygis tampa per aukštas, vyresni sirgaliai rizikuoja patirti širdies priepuolį, o jaunesni - išgerti ir vairuoti. Jų būsena atnaujinama savarankiškai, kaip įrodysime pagrindinėje funkcijoje toliau.

klasė Old_ConcreteObserver: visuomenės stebėtojas
{
   viešas:
     // Kviečia pagrindinį konstruktorių registruotis subjektu
     „Old_ConcreteObserver“ (Tema * mod, int div)
        : Stebėtojas (mod, div) {}
     // Vyresniems žmonėms, jei jaudulio lygis
     // yra daugiau nei 150, jie rizikuoja patirti širdies smūgį
     negalioja atnaujinimas ()
     {
        bool score = getSubject () -> getScored ();
        setExcitementLevel (getExcitementLevel () + 1);
        if (įvertintas && getExcitementLevel ()> 150)
        {
          cout << "Senojo stebėtojo komanda pelnė įvartį !!"
               << "Jo susijaudinimo lygis yra"
               << getExcitementLevel ()
               << "saugokitės širdies priepuolių!" << endl;
        }Kitas{
          cout << "Komanda nepelnė taškų. Yeeeih nėra ko jaudintis"
               << endl;
        }
    } // pabaigos atnaujinimas ()
};
klasė „Young_ConcreteObserver“: visuomenės stebėtojas
{
   viešas:
     // Kviečia pagrindinį konstruktorių registruotis subjektu
     „Young_ConcreteObserver“ (Tema * mod, int div)
       : Stebėtojas (mod, div) {}
     // Vyresniems žmonėms, jei jaudulio lygis
     // yra daugiau nei 100, jie rizikuoja patirti širdies smūgį
     negalioja atnaujinimas ()
     {
        bool score = getSubject () -> getScored ();
        setExcitementLevel (getExcitementLevel () + 1);
        if (įvertintas && getExcitementLevel ()> 100)
        {
          cout << "Jaunojo stebėtojo komanda pelnė įvartį !!"
               << "Jo susijaudinimo lygis yra"
               << getExcitementLevel ()
               << "negeriu ir nevairuok !!" << endl;
        }Kitas{
          cout << "Komanda nepelnė taškų. Taip, nėra ko jaudintis"
               << endl;
       }
    } // pabaigos atnaujinimas ()
};

Pagrindinė funkcija
Konkretūs stebėtojai prisiregistruoja prie objekto. Jų būsena yra jaudulio lygis, kuris yra antrasis parametras. Kai įvykis suaktyvinamas „subj.setScored (true)“, tada, norint atnaujinti registruotus stebėtojus, iškviečiamas objektas :: pranešti (). Žemiau pateiktame scenarijuje mes turime tris stebėtojus: „youngObs1“ yra per daug susijaudinęs ir rizikuoja išgerti bei vairuoti, o „oldObs1“ taip pat per daug suaktyvino, ir kelia kitokią (širdies priepuolio) riziką. Galiausiai, „youngObs2“, kuris taip pat yra jaunas kaip pirmasis, neturi dėl ko jaudintis, nes nėra per daug ekstensyvus.

Svarbu pastebėti, kad trys stebėtojai atsinaujino nepriklausomai, atsižvelgiant į jų būseną (susijaudinimo lygį) ir tipą (jaunas ar senas).
int pagrindinis () {
   Dalykas subj;
   Young_ConcreteObserver youngObs1 (& subj, 100);
   Old_ConcreteObserver oldObs1 (& subj, 150);
   Young_ConcreteObserver youngObs2 (& subj, 52);
   subj.setScored (tiesa);
}
// Išėjimas
// Jaunojo stebėtojo komanda pelnė rezultatą !! Jo susijaudinimo lygis yra 101
// negerti ir nevairuoti !!
// Senojo stebėtojo komanda pelnė įvartį !! Jo susijaudinimo lygis yra 151 žiūrėti
// iš širdies priepuolių! Komanda nepelnė taškų.
// Yeeh nieko nerimauti

Yra keletas „Observer“ modelio naudojimo pranašumų ir keli punktai, į kuriuos reikia atkreipti dėmesį, kai reikia kreiptis į šį modelį [„Python Design Patterns“ mokymasis].

  • Stebėtojo schema pateikia struktūrą, kurioje subjektas ir stebėtojas yra laisvai susieti. Dalykui nereikia žinoti apie „ConcreteObserver“ klasę. Bet kurį naują stebėtoją galima pridėti bet kuriuo metu. Pridedant naują stebėtoją, nereikia modifikuoti subjekto. Stebėtojai ir tiriamieji nėra susieti ir yra nepriklausomi vienas nuo kito, todėl pokyčiai tiriamojo ar stebėtojo srityje vienas kito nepaveiks.
  • Nėra galimybės kompozicijai, nes „Observer“ sąsaja gali būti akimirksniu sukurta.
  • Jei stebėtojas netinkamai naudojamas, jis gali lengvai tapti sudėtingesnis ir sukelti veiklos problemų.
  • Pranešimai gali būti nepatikimi ir sukelti varžybų sąlygas ar nesuderinamumą.

Kitas tinklaraštis bus trumpas Tilto projektavimo modelio vadovas. Tai yra konstrukcinis modelis, gana dažnai naudojamas pramonėje. Nepamirškite patikti / užklijuoti mano tinklaraščio įrašą ir sekti mano paskyros. Tai man teikia pasitenkinimą, kad padėjau kai kuriems kolegoms kūrėjams ir pastūmėjau toliau rašyti. Jei yra konkretus dizaino modelis, apie kurį norėtumėte sužinoti, praneškite man, kad galėčiau jį pateikti ateityje.

Kiti greiti dizaino modelių vadovai:

  1. Dizaino modeliai - trumpas „Abstract Factory“ vadovas.
  2. Dizaino modeliai - trumpas tiltų modelio vadovas.
  3. Dizaino modeliai - trumpas „Builder Pattern“ vadovas.
  4. Dizaino modeliai - trumpas dekoravimo priemonės modelio vadovas.
  5. Dizaino modeliai - trumpas fasado modelio vadovas.
  6. Dizaino modeliai - trumpas stebėtojų modelio vadovas.
  7. Dizaino modeliai - trumpas „Singleton Pattern“ vadovas.