|
|
Opslået på 30/07/2018 10.30.45
|
|
|

Indførelsen
Flyweight-tilstand understøtter effektivt et stort antal finkornede objekter ved at køre delingsteknologi, undgå overhead ved et stort antal små klasser med samme indhold (såsom at forbruge hukommelse), og tillader alle at dele en klasse (meta-klasse).
I programmering er det nogle gange nødvendigt at producere et stort antal finkornede klasseinstanser for at repræsentere data, og hvis du kan finde, at disse instanser stort set har samme overhead bortset fra nogle få parametre, kan antallet af klasser, der skal instansieres, reduceres betydeligt. Hvis du kan flytte disse parametre uden for klasseinstansen og sende dem ind, når metoden kaldes, kan du markant reducere antallet af individuelle instanser ved at dele.
Hvad så, hvis du anvender meta-tilstanden i JavaScript? Der er to måder, den første anvendes på datalaget, hovedsageligt på et stort antal lignende objekter i hukommelsen; Den anden anvendes på DOM-laget, som kan bruges i den centrale event manager for at undgå at tilknytte hændelseshåndtag til hvert børneelement i forældrecontaineren.
Nyd metaverset og datalagene
Der er to vigtige begreber i Flyweight – intern tilstand intrinsisk og ekstern tilstand ekstrinsisk, intern tilstand styres i objektet gennem interne metoder, og ekstern information kan slettes eller gemmes eksternt.
For at sige det ligeud, er det først at klemme en original model, og derefter med forskellige lejligheder og miljøer, og derefter producere specifikke modeller med deres egne karakteristika; selvfølgelig skal der genereres nye objekter her, så fabrikstilstanden optræder ofte i Flyweight-tilstanden, den interne tilstand af Flyweight bruges til at dele, og Flyweight-fabrikken er ansvarlig for at vedligeholde en Flyweight-pool (mønsterpool) til at opbevare objekterne i den interne tilstand.
Brug Yuanyuan-tilstanden
Lad os demonstrere, at hvis vi havde et bibliotek til at administrere alle bøgerne, ville metadataene for hver bog foreløbigt se sådan ud:
ID Titel Forfatter Genre Sideantal Forlags-ID ISBN Vi skal også definere, hvornår og af hvem hver bog blev lånt, samt returdato og tilgængelighed:
Udtjekningsdato checkoutMedlem forfaldsdato Tilgængelighed Da bogobjektet er sat til følgende kode, skal man bemærke, at koden endnu ikke er optimeret:
Programmet kan være fint i starten, men over tid kan antallet af bøger stige i store mængder, og hver bog har en forskellig version og mængde, og du vil opdage, at systemet bliver langsommere og langsommere. Tusindvis af bogobjekter i hukommelsen kan forestilles, og vi skal optimere dem med delingstilstanden.
Vi kan opdele dataene i to typer data: interne og eksterne, og data relateret til bogobjektet (titel, forfatter osv.) kan tilskrives interne attributter, mens (checkoutMember, dueReturnDate osv.) kan tilskrives eksterne attributter. På denne måde kan følgende kode dele det samme objekt i den samme bog, fordi uanset hvem der låner bogen, så længe bogen er den samme bog, er den grundlæggende information den samme:
Definér den grundlæggende fabrik
Lad os definere en grundlæggende fabrik for at tjekke, om objektet i bogen blev skabt før, returnere hvis der er, og genskabe og gemme den, hvis ikke, hvilket sikrer, at vi kun skaber et objekt for hver type bog:
Administrer ekstern status
Den ydre tilstand er relativt enkel, bortset fra bogen vi indkapslede, alt andet skal håndteres her:
På denne måde kan vi gemme den samme information om den samme bog i et bogmanager-objekt og kun én kopi; Sammenlignet med den tidligere kode kan man konstatere, at meget hukommelse er gemt.
Nyd meta-tilstanden og DOM
Jeg vil ikke sige så meget om DOM-bobling-hændelsen her, jeg tror, alle allerede ved det, lad os give to eksempler.
Eksempel 1: Centraliseret hændelsesstyring For eksempel, hvis vi har mange lignende typer elementer eller strukturer (såsom menuer eller flere li i ul), der skal overvåge hans klik-begivenhed, så skal vi binde hvert element mere til begivenhedsbinding, hvis der er meget, meget mange elementer, kan ydeevnen forestilles, og kombineret med kendskabet til bobling, hvis et barnelement har en begivenheds-trigger, vil begivenheden boble til det højere element efter udløsing, så ved at bruge denne funktion kan vi bruge Xiangyuan-tilstanden. Vi kan overvåge begivenhederne for forældreelementerne for disse lignende elementer og derefter afgøre, hvilket børneelement der har en hændelse udløst, før vi fortsætter med yderligere operationer.
Her kombinerer vi jQuerys bind/unbind-metoder som et eksempel.
HTML:
JavaScript:
Eksempel 2: Anvend Xiangyuan-tilstanden for at forbedre ydeevnen
Et andet eksempel, stadig relateret til jQuery, generelt bruger vi elementobjektet i callback-funktionen for eventet, vi bruger ofte formen $(this), faktisk opretter det gentagne gange et nyt objekt, fordi dette i callback-funktionen allerede er selve DOM-elementet, vi skal bruge følgende kode:
Faktisk, hvis vi skal bruge noget som $(this), kan vi også implementere vores egen version af single-instance-mønsteret, for eksempel kan vi implementere en funktion som jQuery.signle(this) for at returnere selve DOM-elementet:
Sådan bruger du:
Dette returnerer DOM-elementet som det er, uden at oprette et jQuery-objekt.
resumé
Flyweight-tilstand er en tilstand, der forbedrer programmets effektivitet og ydeevne, hvilket vil øge programmets kørehastighed betydeligt. Der er mange anvendelser: for eksempel, hvis du vil læse en række strenge fra en database, hvoraf mange er dubletter, kan vi gemme disse strenge i en Flyweight-pool.
Hvis en applikation bruger et stort antal objekter, og disse mange objekter giver meget lagringsglæde, bør den overveje at bruge delingstilstanden; Hvis du sletter objektets eksterne tilstand, kan du erstatte mange grupper af objekter med relativt få delte objekter, og du kan overveje at bruge Xiangyuan-tilstanden.
Referenceadresse:http://www.addyosmani.com/resour ... ok/#detailflyweight
|
Tidligere:Anbefaler 3 hjemmesider til at finde ikonikonerNæste:AntalAfventendeBeskeder, BeskederKø, Beskeder...
|