Dizaina modelis ir veidne, kas atrisina bieži atkārtotu programmatūras izstrādes problēmu.

Novērotāju modelis, kas pazīstams arī kā publicēšanas-abonēšanas modelis, ir uzvedības modelis. Tas ļauj jums paziņot vairākiem objektiem vai abonentiem par jebkuru notikumu, kas ir publicēts objektā, kuru viņi novēro.

Šeit jūs uzzināsit, kā ieviest novērotāja dizaina modeli programmā TypeScript.

Novērotāja modelis

Novērotāja modelis darbojas, definējot attiecības viens pret daudziem starp izdevēju un tā abonentiem. Kad izdevējā notiek notikums, tas informēs visus abonentus par šo notikumu. Viens plaši izplatīts šī modeļa piemērs ir JavaScript notikumu klausītāji.

Kontekstam pieņemsim, ka veidojat krājumu izsekotāju, kas seko līdzi preču skaitam jūsu veikalā. Šajā gadījumā jūsu veikals ir subjekts/izdevējs, un jūsu krājumi ir novērotājs/abonents. Šajā situācijā optimāli būtu izmantot novērotāja dizaina modeli.

Novērotāja dizaina modelī jūsu mācību priekšmeta klasei ir jāievieš trīs metodes:

  • An pievienot metodi. Šī metode objektam pievieno novērotāju.
  • instagram viewer
  • A atdalīties metodi. Šī metode no objekta noņem novērotāju.
  • A paziņot/atjaunināt metodi. Šī metode informē subjekta novērotājus, kad mainās subjekta stāvoklis.

Jūsu novērotāju klasei ir jāievieš viena metode, the Atjaunināt metodi. Šī metode reaģē, ja mainās tās subjekta stāvoklis.

Subjektu un novērotāju klašu ieviešana

Pirmais solis, lai ieviestu šo modeli, ir izveidot saskarnes subjekta un novērotāja klasei, lai nodrošinātu, ka viņi ievieš pareizās metodes:

// Priekšmeta/izdevēja saskarne
saskarnePriekšmets{
attachObserver (novērotājs: novērotājs): nederīgs;
detachObserver (novērotājs: novērotājs): nederīgs;
notifyObserver(): nederīgs;
}

// Novērotāja/abonenta saskarne
saskarneNovērotājs{
Atjaunināt(tēma: Temats): nederīgs;
}

Iepriekš minētajā koda blokā esošās saskarnes nosaka metodes, kas jāīsteno jūsu konkrētajām klasēm.

Konkrētu priekšmetu klase

Nākamais solis ir ieviest konkrētu priekšmetu klasi, kas īsteno Priekšmets interfeiss:

// Tēma
klasēVeikalsīstenoPriekšmets{}

Pēc tam inicializējiet Priekšmets’s stāvoklī Veikals klasē. Objekta novērotāji reaģēs uz šī stāvokļa izmaiņām.

Šajā gadījumā stāvoklis ir skaitlis, un novērotāji reaģēs uz skaita pieaugumu:

// Priekšmeta stāvoklis
Privāts numberOfProducts: numurs;

Pēc tam inicializējiet novērotāju masīvu. Šis masīvs ir veids, kā sekot līdzi novērotājiem:

// inicializējot novērotājus
Privāts novērotāji: novērotājs[] = [];

Varat atrast dažas novērotāja modeļa implementācijas, izmantojot a Iestatiet datu struktūru masīva vietā, lai izsekotu novērotājam. Izmantojot komplektu, tiks nodrošināts, ka viens un tas pats novērotājs neparādīsies divas reizes. Ja tā vietā vēlaties izmantot masīvu, pārbaudiet, vai savā ierīcē nav novērotāju dublikātu pievienot metodi.

Tālāk jums vajadzētu ieviest Priekšmetsmetodes -pievienot, atdalīties, un paziņot/atjaunināt— savā betona klasē.

Lai īstenotu pievienot metodi, vispirms pārbaudiet, vai novērotājs jau ir pievienots, un ierakstiet kļūdu, ja tā ir. Pretējā gadījumā pievienojiet novērotāju masīvam, izmantojot JavaScript masīva metode, spiediet:

// Novērotāja(-u) pievienošana
attachObserver (novērotājs: novērotājs): nederīgs {
// Pārbaudiet, vai novērotājs jau ir pievienots
konst novērotājsPastāv = šis.novērotāji.ietver (novērotājs);

if (observerExists) {
mestjaunsKļūda('Novērotājs jau ir abonēts');
}

// Pievienot jaunu novērotāju
šis.novērotāji.spiediet(novērotājs);
}

Tālāk īstenojiet savu atdalīties metodi, atrodot indeksu un noņemot to no masīva, izmantojot JavaScript salaidums metodi.

Var būt scenāriji, kad novērotājs, kuru mēģināt atdalīt, jau ir atdalīts vai arī nav abonēts. Jums vajadzētu rīkoties ar šiem scenārijiem, pievienojot nosacījumu paziņojumu, lai pārbaudītu, vai novērotājs atrodas masīvā vai komplektā, atkarībā no gadījuma.

// Novērotāja(-u) atdalīšana
detachObserver (novērotājs: novērotājs): nederīgs {
konsole.log(`Novērotāja atdalīšana ${JSON.stringify (novērotājs)}`);
konst novērotājsIndekss = šis.observers.indexOf (novērotājs);

if (observerIndex -1) {
mestjaunsKļūda('Novērotājs neeksistē');
}

šis.novērotāji.savienot(novērotāja indekss, 1);
console.log('Novērotājs atdalīts...');
}

Tālāk īstenojiet savu paziņot/atjaunināt metodi, pārskatot savu novērotāju sarakstu un izsaucot Atjaunināt katra metode:

// Novērotāju paziņošana
notifyObserver(): nederīgs {
console.log('Novērotāju paziņošana...');

priekš (konst novērotājs nošis.observers) {
novērotājs.update(šis);
}
}

Visbeidzot, par Priekšmets klasē, ievieš metodi, kas manipulē ar stāvokli un pēc tam paziņo novērotājiem par izmaiņām, izsaucot viņu paziņot/atjaunināt metodi. Šis piemērs ir vienkāršots tam, kā subjekts var veikt darbību un pēc tam informēt novērotājus:

// Stāvokļa maiņa un novērotāju paziņošana
jaunsProdukts (produkti: numurs): nederīgs {
šis.numberOfProducts += produkti;
console.log('Veikalam pievienots jauns produkts');
šis.notifyObserver();
}

Konkrētas novērotāju klases

Izveidojiet novērotāju klasi vai klases, lai abonētu izdevēju. Katrai novērotāju klasei ir jāīsteno Novērotājs saskarne.

Novērotāju klases īstenos a paziņot/atjaunināt metode, kuru vajadzētu izsaukt tikai subjektam, kuru viņi novēro. Šajā metodē ir jāietver visa biznesa loģika, kas jums jāpalaiž, reaģējot uz subjekta stāvokļa izmaiņām:

// Betona novērotājs 1
klasēInventārsīstenoNovērotājs{
Atjaunināt(): nederīgs {
console.log('Veikalam pievienots jauns produkts, atjaunināts krājums...');
// Šeit iet faktiskā biznesa loģika...
}
}

// Betona novērotājs 2
klasēKlientsīstenoNovērotājs{
Atjaunināt(): nederīgs {
console.log('Veikalam pievienots jauns produkts, jāiet apskatīties...');
// Šeit iet faktiskā biznesa loģika...
}
}

Izmantojot novērotāja modeli

Lai izmantotu šo modeli, izveidojiet konkrēto priekšmetu un novērotāju klases. Kad tas ir izdarīts, zvaniet Subjektam pievienot metodi un nododiet Observer gadījumu kā argumentu. Atbildot uz to, subjekts pievienos šo gadījumu savam novērotāju sarakstam:

// Instantiating Subject and Observer
konst veikals = jauns Veikals();
konst inventārs = jauns Inventārs();
konst klients = jauns Klients()

// Objektu abonēšana izdevējam
veikals.attachObserver(inventārs);
veikals.attachObserver(klientu);
// Priekšmeta stāvokļa maiņa
veikals.jaunsProdukts(30);

Šis kods simulē stāvokļa maiņu. Izmaiņas aktivizēs paziņošanas metodi vietnē Priekšmets klasē. Šo metodi savukārt sauc par paziņot metodi katram tās novērotājam. Pēc tam katrs novērotājs vadīs savu biznesa loģiku.

Šo modeli vajadzētu izmantot tikai tad, ja viena objekta stāvokļa izmaiņas ietekmē citus objektus un iesaistīto objektu kopa nav zināma vai dinamiska.

Novērotāja modeļa izmantošanas priekšrocības

Izmantojot šo modeli savā kodā, varat saglabāt atvēršanas/aizvēršanas principu. Varat pievienot tik daudz abonentu, cik vēlaties, un izveidot attiecības starp objektiem izpildlaikā, nemainot subjekta kodu.