A tervezési minta egy olyan sablon, amely a szoftvertervezés során gyakran visszatérő problémát old meg.

A megfigyelő minta, más néven közzététel-feliratkozás minta, egy viselkedési minta. Lehetővé teszi több objektum vagy előfizető értesítését az általuk megfigyelt objektumban közzétett eseményekről.

Itt megtudhatja, hogyan valósítsa meg a megfigyelő tervezési mintáját TypeScriptben.

A megfigyelő minta

A megfigyelő minta úgy működik, hogy egy-a többhez viszonyt határoz meg a kiadó és előfizetői között. Amikor egy esemény történik a kiadóban, minden előfizetőt értesít az eseményről. Ennek a mintának az egyik elterjedt példája JavaScript eseményfigyelők.

A kontextus szempontjából tegyük fel, hogy egy készletkövetőt hoz létre, amely nyomon követi az üzletében található termékek számát. Ebben az esetben az Ön üzlete a tárgy/kiadó, a készlete pedig a megfigyelő/előfizető. Ebben a helyzetben a megfigyelő tervezési minta alkalmazása lenne az optimális.

A megfigyelő tervezési mintában a tantárgy osztályának három módszert kell megvalósítania:

instagram viewer
  • An csatolni módszer. Ez a módszer megfigyelőt ad az alanyhoz.
  • A leválasztani módszer. Ez a módszer eltávolítja a megfigyelőt az alanyból.
  • A értesíteni/frissíteni módszer. Ez a módszer értesíti az alany megfigyelőit, ha az alany állapota megváltozik.

A megfigyelő osztálynak egy módszert kell megvalósítania, a frissítés módszer. Ez a módszer akkor reagál, ha az alany állapota megváltozik.

Az alany és a megfigyelő osztályok megvalósítása

A minta megvalósításának első lépése interfész létrehozása az alany és a megfigyelő osztály számára, hogy biztosítsák a megfelelő metódusok megvalósítását:

// Tárgy/Kiadó felület
felületTantárgy{
attachObserver (megfigyelő: Observer): üres;
detachObserver (megfigyelő: Observer): üres;
notifyObserver(): üres;
}

// Megfigyelő/előfizető interfész
felületMegfigyelő{
frissítés(tárgy: Tárgy): üres;
}

A fenti kódblokkban található interfészek meghatározzák azokat a metódusokat, amelyeket a konkrét osztályoknak implementálniuk kell.

Egy konkrét tantárgy osztály

A következő lépés egy konkrét tantárgyosztály megvalósítása, amely megvalósítja a Tantárgy felület:

// Tantárgy
osztályBoltmegvalósítjaTantárgy{}

Ezután inicializálja a Tantárgy’s állapot a Bolt osztály. Az alany megfigyelői reagálnak az állapot változásaira.

Ebben az esetben az állapot egy szám, és a megfigyelők a szám növekedésére reagálnak:

// Tárgy állapota
magán NumberOfProducts: szám;

Ezután inicializálja a megfigyelők tömbjét. Ezzel a tömbbel követheti nyomon a megfigyelőket:

// megfigyelők inicializálása
magán megfigyelők: Megfigyelő[] = [];

Megtalálhatja a megfigyelő minta néhány megvalósítását a segítségével a Állítsa be az adatstruktúrát egy tömb helyett a megfigyelő nyomon követésére. A készlet használata biztosítja, hogy ugyanaz a megfigyelő ne jelenjen meg kétszer. Ha helyette egy tömböt szeretne használni, ellenőrizze, hogy nincsenek-e duplikált megfigyelők a sajátjában csatolni módszer.

Ezután végre kell hajtania a Tantárgymódszerei –csatolni, leválasztani, és értesíteni/frissíteni-a beton osztályában.

A végrehajtásához a csatolni módszerrel, először ellenőrizze, hogy a megfigyelő már csatlakoztatva van-e, és dobjon hibát, ha igen. Ellenkező esetben adja hozzá a megfigyelőt a tömbhöz a JavaScript tömb módszer, nyom:

Megfigyelő(k) csatlakoztatása
attachObserver (megfigyelő: Observer): üres {
// Ellenőrizze, hogy a megfigyelőt már csatolták-e
const megfigyelőLétezik = ez.observers.includes (megfigyelő);

if (megfigyelő létezik) {
dobásújHiba('A megfigyelőt már előfizették');
}

// Új megfigyelő hozzáadása
ez.megfigyelők.nyom(megfigyelő);
}

Ezután hajtsa végre a sajátját leválasztani módszert úgy, hogy megkeresi az indexet és eltávolítja a tömbből a JavaScript segítségével toldás módszer.

Előfordulhatnak olyan forgatókönyvek, amikor a leválasztani kívánt megfigyelőt már leválasztották, vagy először nem fizették elő. Ezeket a forgatókönyveket egy feltételes utasítás hozzáadásával kell kezelnie annak ellenőrzésére, hogy a megfigyelő a tömbben vagy a halmazban van-e.

Megfigyelő(k) leválasztása
detachObserver (megfigyelő: Observer): üres {
konzol.log(`Eltávolító megfigyelő ${JSON.stringify (megfigyelő)}`);
const megfigyelőIndex = ez.observers.indexOf (megfigyelő);

if (observerIndex -1) {
dobásújHiba('A megfigyelő nem létezik');
}

ez.megfigyelők.illesztés(megfigyelőIndex, 1);
console.log('A megfigyelő levált...');
}

Ezután hajtsa végre a sajátját értesíteni/frissíteni metódust úgy, hogy végigpörgeti a megfigyelők listáját, és meghívja a frissítés mindegyik módszere:

// Figyelők értesítése
notifyObserver(): üres {
console.log('Megfigyelők értesítése...');

számára (const megfigyelő nak,-nekez.observers) {
megfigyelő.update(ez);
}
}

Végül a Tantárgy osztályba valósítson meg egy metódust, amely manipulálja az állapotot, majd a megfigyelőket hívásával értesíti a változásról értesíteni/frissíteni módszer. Ez a példa annak leegyszerűsítése, hogy az alany hogyan hajthat végre egy cselekvést, majd tájékoztatja a megfigyelőket:

// Állapotváltás és a megfigyelők értesítése
új Termék (termékek száma): üres {
ez.numberOfProducts += termékek;
console.log('Új termék került az üzletbe');
ez.notifyObserver();
}

Konkrét megfigyelő osztályok

Hozzon létre egy megfigyelő osztályt vagy osztályokat a kiadóra való feliratkozáshoz. Minden megfigyelő osztálynak végre kell hajtania a Megfigyelő felület.

A megfigyelő osztályok a értesíteni/frissíteni módszer, amelyet csak az általuk megfigyelt alany hívhat meg. Ennek a módszernek tartalmaznia kell az összes üzleti logikát, amelyet az alany állapotában bekövetkezett változásra válaszul kell futtatnia:

// Concrete Observer 1
osztályLeltármegvalósítjaMegfigyelő{
frissítés(): üres {
console.log('Új termék került az üzletbe, készlet frissítése...');
// A tényleges üzleti logika ide tartozik...
}
}

// Concrete Observer 2
osztályVevőmegvalósítjaMegfigyelő{
frissítés(): üres {
console.log('Új termék került a boltba, meg kell néznem...');
// A tényleges üzleti logika ide tartozik...
}
}

A megfigyelő minta használata

Ennek a mintának a használatához példányosítsa a konkrét alany és megfigyelő osztályokat. Ha ezt megtette, hívja fel az alanyt csatolni metódust, és adja át az Observer példányt argumentumként. Válaszul az alany felveszi ezt a példányt a megfigyelők listájára:

// Példányos alany és megfigyelő
const bolt = új Bolt();
const készlet = új Leltár();
const ügyfél = új Vevő()

// Objektumok előfizetése a kiadóhoz
bolt.attachObserver(leltár);
bolt.attachObserver(vevő);
// Tárgyállapot módosítása
bolt.új termék(30);

Ez a kód állapotváltozást szimulál. A módosítás elindítja az értesítési metódust a Tantárgy osztály. Ez a módszer pedig a értesítse módszer minden egyes megfigyelőjén. Ezután minden megfigyelő a saját üzleti logikáját fogja végrehajtani.

Ezt a mintát csak akkor használja, ha az egyik objektum állapotának változásai más objektumokra is hatással vannak, és az érintett objektumok halmaza ismeretlen vagy dinamikus.

A megfigyelő minta használatának előnyei

Ennek a mintának a kódjában való használata lehetővé teszi a nyitás/zárás elvének fenntartását. Tetszőleges számú előfizetőt adhat hozzá, és futás közben kapcsolatokat hozhat létre az objektumok között anélkül, hogy megváltoztatná az alany kódját.