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:
- 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.